Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: remove dead TI wl128x FM radio driver

Commit 78fe66360ed6 ("misc: ti-st: st_kim: remove the driver") deletes the
ti-st driver and its corresponding config option TI_ST.

With that deletion, the Texas Instruments WL128x FM Radio driver is now
dead as well. Delete this obsolete driver.

Signed-off-by: Lukas Bulwahn <lukas.bulwahn@redhat.com>
Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>

authored by

Lukas Bulwahn and committed by
Hans Verkuil
945215ee 1378ffec

-4247
-4
drivers/media/radio/Kconfig
··· 221 221 source "drivers/media/radio/si470x/Kconfig" 222 222 source "drivers/media/radio/si4713/Kconfig" 223 223 224 - # TI's ST based wl128x FM radio 225 - 226 - source "drivers/media/radio/wl128x/Kconfig" 227 - 228 224 # 229 225 # ISA drivers configuration 230 226 #
-1
drivers/media/radio/Makefile
··· 31 31 obj-$(CONFIG_RADIO_TRUST) += radio-trust.o 32 32 obj-$(CONFIG_RADIO_TYPHOON) += radio-typhoon.o 33 33 obj-$(CONFIG_RADIO_WL1273) += radio-wl1273.o 34 - obj-$(CONFIG_RADIO_WL128X) += wl128x/ 35 34 obj-$(CONFIG_RADIO_ZOLTRIX) += radio-zoltrix.o 36 35 37 36 obj-$(CONFIG_USB_DSBR) += dsbr100.o
-15
drivers/media/radio/wl128x/Kconfig
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - # 3 - # TI's wl128x FM driver based on TI's ST driver. 4 - # 5 - config RADIO_WL128X 6 - tristate "Texas Instruments WL128x FM Radio" 7 - depends on VIDEO_DEV && RFKILL && TTY && TI_ST 8 - depends on GPIOLIB || COMPILE_TEST 9 - help 10 - Choose Y here if you have this FM radio chip. 11 - 12 - In order to control your radio card, you will need to use programs 13 - that are compatible with the Video For Linux 2 API. Information on 14 - this API and pointers to "v4l2" programs may be found at 15 - <file:Documentation/userspace-api/media/index.rst>.
-7
drivers/media/radio/wl128x/Makefile
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - # 3 - # Makefile for TI's shared transport driver based wl128x 4 - # FM radio. 5 - # 6 - obj-$(CONFIG_RADIO_WL128X) += fm_drv.o 7 - fm_drv-objs := fmdrv_common.o fmdrv_rx.o fmdrv_tx.o fmdrv_v4l2.o
-229
drivers/media/radio/wl128x/fmdrv.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * 5 - * Common header for all FM driver sub-modules. 6 - * 7 - * Copyright (C) 2011 Texas Instruments 8 - */ 9 - 10 - #ifndef _FM_DRV_H 11 - #define _FM_DRV_H 12 - 13 - #include <linux/skbuff.h> 14 - #include <linux/interrupt.h> 15 - #include <sound/core.h> 16 - #include <sound/initval.h> 17 - #include <linux/timer.h> 18 - #include <linux/workqueue.h> 19 - #include <media/v4l2-ioctl.h> 20 - #include <media/v4l2-common.h> 21 - #include <media/v4l2-device.h> 22 - #include <media/v4l2-ctrls.h> 23 - 24 - #define FM_DRV_VERSION "0.1.1" 25 - #define FM_DRV_NAME "ti_fmdrv" 26 - #define FM_DRV_CARD_SHORT_NAME "TI FM Radio" 27 - #define FM_DRV_CARD_LONG_NAME "Texas Instruments FM Radio" 28 - 29 - /* Flag info */ 30 - #define FM_INTTASK_RUNNING 0 31 - #define FM_INTTASK_SCHEDULE_PENDING 1 32 - #define FM_FW_DW_INPROGRESS 2 33 - #define FM_CORE_READY 3 34 - #define FM_CORE_TRANSPORT_READY 4 35 - #define FM_AF_SWITCH_INPROGRESS 5 36 - #define FM_CORE_TX_XMITING 6 37 - 38 - #define FM_TUNE_COMPLETE 0x1 39 - #define FM_BAND_LIMIT 0x2 40 - 41 - #define FM_DRV_TX_TIMEOUT (5*HZ) /* 5 seconds */ 42 - #define FM_DRV_RX_SEEK_TIMEOUT (20*HZ) /* 20 seconds */ 43 - 44 - #define fmerr(format, ...) \ 45 - printk(KERN_ERR "fmdrv: " format, ## __VA_ARGS__) 46 - #define fmwarn(format, ...) \ 47 - printk(KERN_WARNING "fmdrv: " format, ##__VA_ARGS__) 48 - #ifdef DEBUG 49 - #define fmdbg(format, ...) \ 50 - printk(KERN_DEBUG "fmdrv: " format, ## __VA_ARGS__) 51 - #else /* DEBUG */ 52 - #define fmdbg(format, ...) do {} while(0) 53 - #endif 54 - enum { 55 - FM_MODE_OFF, 56 - FM_MODE_TX, 57 - FM_MODE_RX, 58 - FM_MODE_ENTRY_MAX 59 - }; 60 - 61 - #define FM_RX_RDS_INFO_FIELD_MAX 8 /* 4 Group * 2 Bytes */ 62 - 63 - /* RX RDS data format */ 64 - struct fm_rdsdata_format { 65 - union { 66 - struct { 67 - u8 buff[FM_RX_RDS_INFO_FIELD_MAX]; 68 - } groupdatabuff; 69 - struct { 70 - u16 pidata; 71 - u8 blk_b[2]; 72 - u8 blk_c[2]; 73 - u8 blk_d[2]; 74 - } groupgeneral; 75 - struct { 76 - u16 pidata; 77 - u8 blk_b[2]; 78 - u8 af[2]; 79 - u8 ps[2]; 80 - } group0A; 81 - struct { 82 - u16 pi[2]; 83 - u8 blk_b[2]; 84 - u8 ps[2]; 85 - } group0B; 86 - } data; 87 - }; 88 - 89 - /* FM region (Europe/US, Japan) info */ 90 - struct region_info { 91 - u32 chanl_space; 92 - u32 bot_freq; 93 - u32 top_freq; 94 - u8 fm_band; 95 - }; 96 - struct fmdev; 97 - typedef void (*int_handler_prototype) (struct fmdev *); 98 - 99 - /* FM Interrupt processing related info */ 100 - struct fm_irq { 101 - u8 stage; 102 - u16 flag; /* FM interrupt flag */ 103 - u16 mask; /* FM interrupt mask */ 104 - /* Interrupt process timeout handler */ 105 - struct timer_list timer; 106 - u8 retry; 107 - int_handler_prototype *handlers; 108 - }; 109 - 110 - /* RDS info */ 111 - struct fm_rds { 112 - u8 flag; /* RX RDS on/off status */ 113 - u8 last_blk_idx; /* Last received RDS block */ 114 - 115 - /* RDS buffer */ 116 - wait_queue_head_t read_queue; 117 - u32 buf_size; /* Size is always multiple of 3 */ 118 - u32 wr_idx; 119 - u32 rd_idx; 120 - u8 *buff; 121 - }; 122 - 123 - #define FM_RDS_MAX_AF_LIST 25 124 - 125 - /* 126 - * Current RX channel Alternate Frequency cache. 127 - * This info is used to switch to other freq (AF) 128 - * when current channel signal strength is below RSSI threshold. 129 - */ 130 - struct tuned_station_info { 131 - u16 picode; 132 - u32 af_cache[FM_RDS_MAX_AF_LIST]; 133 - u8 afcache_size; 134 - u8 af_list_max; 135 - }; 136 - 137 - /* FM RX mode info */ 138 - struct fm_rx { 139 - struct region_info region; /* Current selected band */ 140 - u32 freq; /* Current RX frquency */ 141 - u8 mute_mode; /* Current mute mode */ 142 - u8 deemphasis_mode; /* Current deemphasis mode */ 143 - /* RF dependent soft mute mode */ 144 - u8 rf_depend_mute; 145 - u16 volume; /* Current volume level */ 146 - u16 rssi_threshold; /* Current RSSI threshold level */ 147 - /* Holds the index of the current AF jump */ 148 - u8 afjump_idx; 149 - /* Will hold the frequency before the jump */ 150 - u32 freq_before_jump; 151 - u8 rds_mode; /* RDS operation mode (RDS/RDBS) */ 152 - u8 af_mode; /* Alternate frequency on/off */ 153 - struct tuned_station_info stat_info; 154 - struct fm_rds rds; 155 - }; 156 - 157 - #define FMTX_RDS_TXT_STR_SIZE 25 158 - /* 159 - * FM TX RDS data 160 - * 161 - * @ text_type: is the text following PS or RT 162 - * @ text: radio text string which could either be PS or RT 163 - * @ af_freq: alternate frequency for Tx 164 - * TODO: to be declared in application 165 - */ 166 - struct tx_rds { 167 - u8 text_type; 168 - u8 text[FMTX_RDS_TXT_STR_SIZE]; 169 - u8 flag; 170 - u32 af_freq; 171 - }; 172 - /* 173 - * FM TX global data 174 - * 175 - * @ pwr_lvl: Power Level of the Transmission from mixer control 176 - * @ xmit_state: Transmission state = Updated locally upon Start/Stop 177 - * @ audio_io: i2S/Analog 178 - * @ tx_frq: Transmission frequency 179 - */ 180 - struct fmtx_data { 181 - u8 pwr_lvl; 182 - u8 xmit_state; 183 - u8 audio_io; 184 - u8 region; 185 - u16 aud_mode; 186 - u32 preemph; 187 - u32 tx_frq; 188 - struct tx_rds rds; 189 - }; 190 - 191 - /* FM driver operation structure */ 192 - struct fmdev { 193 - struct video_device *radio_dev; /* V4L2 video device pointer */ 194 - struct v4l2_device v4l2_dev; /* V4L2 top level struct */ 195 - struct snd_card *card; /* Card which holds FM mixer controls */ 196 - u16 asci_id; 197 - spinlock_t rds_buff_lock; /* To protect access to RDS buffer */ 198 - spinlock_t resp_skb_lock; /* To protect access to received SKB */ 199 - 200 - long flag; /* FM driver state machine info */ 201 - int streg_cbdata; /* status of ST registration */ 202 - 203 - struct sk_buff_head rx_q; /* RX queue */ 204 - struct work_struct rx_bh_work; /* RX BH Work */ 205 - 206 - struct sk_buff_head tx_q; /* TX queue */ 207 - struct work_struct tx_bh_work; /* TX BH Work */ 208 - unsigned long last_tx_jiffies; /* Timestamp of last pkt sent */ 209 - atomic_t tx_cnt; /* Number of packets can send at a time */ 210 - 211 - struct sk_buff *resp_skb; /* Response from the chip */ 212 - /* Main task completion handler */ 213 - struct completion maintask_comp; 214 - /* Opcode of last command sent to the chip */ 215 - u8 pre_op; 216 - /* Handler used for wakeup when response packet is received */ 217 - struct completion *resp_comp; 218 - struct fm_irq irq_info; 219 - u8 curr_fmmode; /* Current FM chip mode (TX, RX, OFF) */ 220 - struct fm_rx rx; /* FM receiver info */ 221 - struct fmtx_data tx_data; 222 - 223 - /* V4L2 ctrl framework handler*/ 224 - struct v4l2_ctrl_handler ctrl_handler; 225 - 226 - /* For core assisted locking */ 227 - struct mutex mutex; 228 - }; 229 - #endif
-1676
drivers/media/radio/wl128x/fmdrv_common.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * 5 - * This sub-module of FM driver is common for FM RX and TX 6 - * functionality. This module is responsible for: 7 - * 1) Forming group of Channel-8 commands to perform particular 8 - * functionality (eg., frequency set require more than 9 - * one Channel-8 command to be sent to the chip). 10 - * 2) Sending each Channel-8 command to the chip and reading 11 - * response back over Shared Transport. 12 - * 3) Managing TX and RX Queues and BH bh Works. 13 - * 4) Handling FM Interrupt packet and taking appropriate action. 14 - * 5) Loading FM firmware to the chip (common, FM TX, and FM RX 15 - * firmware files based on mode selection) 16 - * 17 - * Copyright (C) 2011 Texas Instruments 18 - * Author: Raja Mani <raja_mani@ti.com> 19 - * Author: Manjunatha Halli <manjunatha_halli@ti.com> 20 - */ 21 - 22 - #include <linux/delay.h> 23 - #include <linux/firmware.h> 24 - #include <linux/module.h> 25 - #include <linux/nospec.h> 26 - #include <linux/jiffies.h> 27 - 28 - #include "fmdrv.h" 29 - #include "fmdrv_v4l2.h" 30 - #include "fmdrv_common.h" 31 - #include <linux/ti_wilink_st.h> 32 - #include "fmdrv_rx.h" 33 - #include "fmdrv_tx.h" 34 - 35 - /* Region info */ 36 - static struct region_info region_configs[] = { 37 - /* Europe/US */ 38 - { 39 - .chanl_space = FM_CHANNEL_SPACING_200KHZ * FM_FREQ_MUL, 40 - .bot_freq = 87500, /* 87.5 MHz */ 41 - .top_freq = 108000, /* 108 MHz */ 42 - .fm_band = 0, 43 - }, 44 - /* Japan */ 45 - { 46 - .chanl_space = FM_CHANNEL_SPACING_200KHZ * FM_FREQ_MUL, 47 - .bot_freq = 76000, /* 76 MHz */ 48 - .top_freq = 90000, /* 90 MHz */ 49 - .fm_band = 1, 50 - }, 51 - }; 52 - 53 - /* Band selection */ 54 - static u8 default_radio_region; /* Europe/US */ 55 - module_param(default_radio_region, byte, 0); 56 - MODULE_PARM_DESC(default_radio_region, "Region: 0=Europe/US, 1=Japan"); 57 - 58 - /* RDS buffer blocks */ 59 - static u32 default_rds_buf = 300; 60 - module_param(default_rds_buf, uint, 0444); 61 - MODULE_PARM_DESC(default_rds_buf, "RDS buffer entries"); 62 - 63 - /* Radio Nr */ 64 - static u32 radio_nr = -1; 65 - module_param(radio_nr, int, 0444); 66 - MODULE_PARM_DESC(radio_nr, "Radio Nr"); 67 - 68 - /* FM irq handlers forward declaration */ 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 *); 94 - 95 - /* 96 - * When FM common module receives interrupt packet, following handlers 97 - * will be executed one after another to service the interrupt(s) 98 - */ 99 - enum fmc_irq_handler_index { 100 - FM_SEND_FLAG_GETCMD_IDX, 101 - FM_HANDLE_FLAG_GETCMD_RESP_IDX, 102 - 103 - /* HW malfunction irq handler */ 104 - FM_HW_MAL_FUNC_IDX, 105 - 106 - /* RDS threshold reached irq handler */ 107 - FM_RDS_START_IDX, 108 - FM_RDS_SEND_RDS_GETCMD_IDX, 109 - FM_RDS_HANDLE_RDS_GETCMD_RESP_IDX, 110 - FM_RDS_FINISH_IDX, 111 - 112 - /* Tune operation ended irq handler */ 113 - FM_HW_TUNE_OP_ENDED_IDX, 114 - 115 - /* TX power enable irq handler */ 116 - FM_HW_POWER_ENB_IDX, 117 - 118 - /* Low RSSI irq handler */ 119 - FM_LOW_RSSI_START_IDX, 120 - FM_AF_JUMP_SETPI_IDX, 121 - FM_AF_JUMP_HANDLE_SETPI_RESP_IDX, 122 - FM_AF_JUMP_SETPI_MASK_IDX, 123 - FM_AF_JUMP_HANDLE_SETPI_MASK_RESP_IDX, 124 - FM_AF_JUMP_SET_AF_FREQ_IDX, 125 - FM_AF_JUMP_HANDLE_SET_AFFREQ_RESP_IDX, 126 - FM_AF_JUMP_ENABLE_INT_IDX, 127 - FM_AF_JUMP_ENABLE_INT_RESP_IDX, 128 - FM_AF_JUMP_START_AFJUMP_IDX, 129 - FM_AF_JUMP_HANDLE_START_AFJUMP_RESP_IDX, 130 - FM_AF_JUMP_RD_FREQ_IDX, 131 - FM_AF_JUMP_RD_FREQ_RESP_IDX, 132 - FM_LOW_RSSI_FINISH_IDX, 133 - 134 - /* Interrupt process post action */ 135 - FM_SEND_INTMSK_CMD_IDX, 136 - FM_HANDLE_INTMSK_CMD_RESP_IDX, 137 - }; 138 - 139 - /* FM interrupt handler table */ 140 - static int_handler_prototype int_handler_table[] = { 141 - fm_irq_send_flag_getcmd, 142 - fm_irq_handle_flag_getcmd_resp, 143 - fm_irq_handle_hw_malfunction, 144 - fm_irq_handle_rds_start, /* RDS threshold reached irq handler */ 145 - fm_irq_send_rdsdata_getcmd, 146 - fm_irq_handle_rdsdata_getcmd_resp, 147 - fm_irq_handle_rds_finish, 148 - fm_irq_handle_tune_op_ended, 149 - fm_irq_handle_power_enb, /* TX power enable irq handler */ 150 - fm_irq_handle_low_rssi_start, 151 - fm_irq_afjump_set_pi, 152 - fm_irq_handle_set_pi_resp, 153 - fm_irq_afjump_set_pimask, 154 - fm_irq_handle_set_pimask_resp, 155 - fm_irq_afjump_setfreq, 156 - fm_irq_handle_setfreq_resp, 157 - fm_irq_afjump_enableint, 158 - fm_irq_afjump_enableint_resp, 159 - fm_irq_start_afjump, 160 - fm_irq_handle_start_afjump_resp, 161 - fm_irq_afjump_rd_freq, 162 - fm_irq_afjump_rd_freq_resp, 163 - fm_irq_handle_low_rssi_finish, 164 - fm_irq_send_intmsk_cmd, /* Interrupt process post action */ 165 - fm_irq_handle_intmsk_cmd_resp 166 - }; 167 - 168 - static long (*g_st_write) (struct sk_buff *skb); 169 - static struct completion wait_for_fmdrv_reg_comp; 170 - 171 - static inline void fm_irq_call(struct fmdev *fmdev) 172 - { 173 - fmdev->irq_info.handlers[fmdev->irq_info.stage](fmdev); 174 - } 175 - 176 - /* Continue next function in interrupt handler table */ 177 - static inline void fm_irq_call_stage(struct fmdev *fmdev, u8 stage) 178 - { 179 - fmdev->irq_info.stage = stage; 180 - fm_irq_call(fmdev); 181 - } 182 - 183 - static inline void fm_irq_timeout_stage(struct fmdev *fmdev, u8 stage) 184 - { 185 - fmdev->irq_info.stage = stage; 186 - mod_timer(&fmdev->irq_info.timer, jiffies + FM_DRV_TX_TIMEOUT); 187 - } 188 - 189 - #ifdef FM_DUMP_TXRX_PKT 190 - /* To dump outgoing FM Channel-8 packets */ 191 - inline void dump_tx_skb_data(struct sk_buff *skb) 192 - { 193 - int len, len_org; 194 - u8 index; 195 - struct fm_cmd_msg_hdr *cmd_hdr; 196 - 197 - cmd_hdr = (struct fm_cmd_msg_hdr *)skb->data; 198 - printk(KERN_INFO "<<%shdr:%02x len:%02x opcode:%02x type:%s dlen:%02x", 199 - fm_cb(skb)->completion ? " " : "*", cmd_hdr->hdr, 200 - cmd_hdr->len, cmd_hdr->op, 201 - cmd_hdr->rd_wr ? "RD" : "WR", cmd_hdr->dlen); 202 - 203 - len_org = skb->len - FM_CMD_MSG_HDR_SIZE; 204 - if (len_org > 0) { 205 - printk(KERN_CONT "\n data(%d): ", cmd_hdr->dlen); 206 - len = min(len_org, 14); 207 - for (index = 0; index < len; index++) 208 - printk(KERN_CONT "%x ", 209 - skb->data[FM_CMD_MSG_HDR_SIZE + index]); 210 - printk(KERN_CONT "%s", (len_org > 14) ? ".." : ""); 211 - } 212 - printk(KERN_CONT "\n"); 213 - } 214 - 215 - /* To dump incoming FM Channel-8 packets */ 216 - inline void dump_rx_skb_data(struct sk_buff *skb) 217 - { 218 - int len, len_org; 219 - u8 index; 220 - struct fm_event_msg_hdr *evt_hdr; 221 - 222 - evt_hdr = (struct fm_event_msg_hdr *)skb->data; 223 - printk(KERN_INFO ">> hdr:%02x len:%02x sts:%02x numhci:%02x opcode:%02x type:%s dlen:%02x", 224 - evt_hdr->hdr, evt_hdr->len, 225 - evt_hdr->status, evt_hdr->num_fm_hci_cmds, evt_hdr->op, 226 - (evt_hdr->rd_wr) ? "RD" : "WR", evt_hdr->dlen); 227 - 228 - len_org = skb->len - FM_EVT_MSG_HDR_SIZE; 229 - if (len_org > 0) { 230 - printk(KERN_CONT "\n data(%d): ", evt_hdr->dlen); 231 - len = min(len_org, 14); 232 - for (index = 0; index < len; index++) 233 - printk(KERN_CONT "%x ", 234 - skb->data[FM_EVT_MSG_HDR_SIZE + index]); 235 - printk(KERN_CONT "%s", (len_org > 14) ? ".." : ""); 236 - } 237 - printk(KERN_CONT "\n"); 238 - } 239 - #endif 240 - 241 - void fmc_update_region_info(struct fmdev *fmdev, u8 region_to_set) 242 - { 243 - fmdev->rx.region = region_configs[region_to_set]; 244 - } 245 - 246 - /* 247 - * FM common sub-module will queue this bh work whenever it receives 248 - * FM packet from ST driver. 249 - */ 250 - static void recv_bh_work(struct work_struct *t) 251 - { 252 - struct fmdev *fmdev; 253 - struct fm_irq *irq_info; 254 - struct fm_event_msg_hdr *evt_hdr; 255 - struct sk_buff *skb; 256 - u8 num_fm_hci_cmds; 257 - unsigned long flags; 258 - 259 - fmdev = from_work(fmdev, t, tx_bh_work); 260 - irq_info = &fmdev->irq_info; 261 - /* Process all packets in the RX queue */ 262 - while ((skb = skb_dequeue(&fmdev->rx_q))) { 263 - if (skb->len < sizeof(struct fm_event_msg_hdr)) { 264 - fmerr("skb(%p) has only %d bytes, at least need %zu bytes to decode\n", 265 - skb, 266 - skb->len, sizeof(struct fm_event_msg_hdr)); 267 - kfree_skb(skb); 268 - continue; 269 - } 270 - 271 - evt_hdr = (void *)skb->data; 272 - num_fm_hci_cmds = evt_hdr->num_fm_hci_cmds; 273 - 274 - /* FM interrupt packet? */ 275 - if (evt_hdr->op == FM_INTERRUPT) { 276 - /* FM interrupt handler started already? */ 277 - if (!test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) { 278 - set_bit(FM_INTTASK_RUNNING, &fmdev->flag); 279 - if (irq_info->stage != 0) { 280 - fmerr("Inval stage resetting to zero\n"); 281 - irq_info->stage = 0; 282 - } 283 - 284 - /* 285 - * Execute first function in interrupt handler 286 - * table. 287 - */ 288 - irq_info->handlers[irq_info->stage](fmdev); 289 - } else { 290 - set_bit(FM_INTTASK_SCHEDULE_PENDING, &fmdev->flag); 291 - } 292 - kfree_skb(skb); 293 - } 294 - /* Anyone waiting for this with completion handler? */ 295 - else if (evt_hdr->op == fmdev->pre_op && fmdev->resp_comp != NULL) { 296 - 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); 301 - 302 - fmdev->resp_comp = NULL; 303 - atomic_set(&fmdev->tx_cnt, 1); 304 - } 305 - /* Is this for interrupt handler? */ 306 - else if (evt_hdr->op == fmdev->pre_op && fmdev->resp_comp == NULL) { 307 - if (fmdev->resp_skb != NULL) 308 - fmerr("Response SKB ptr not NULL\n"); 309 - 310 - spin_lock_irqsave(&fmdev->resp_skb_lock, flags); 311 - fmdev->resp_skb = skb; 312 - spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); 313 - 314 - /* Execute interrupt handler where state index points */ 315 - irq_info->handlers[irq_info->stage](fmdev); 316 - 317 - kfree_skb(skb); 318 - atomic_set(&fmdev->tx_cnt, 1); 319 - } else { 320 - fmerr("Nobody claimed SKB(%p),purging\n", skb); 321 - } 322 - 323 - /* 324 - * Check flow control field. If Num_FM_HCI_Commands field is 325 - * not zero, queue FM TX bh work. 326 - */ 327 - if (num_fm_hci_cmds && atomic_read(&fmdev->tx_cnt)) 328 - if (!skb_queue_empty(&fmdev->tx_q)) 329 - queue_work(system_bh_wq, &fmdev->tx_bh_work); 330 - } 331 - } 332 - 333 - /* FM send_bh_work: is scheduled when FM packet has to be sent to chip */ 334 - static void send_bh_work(struct work_struct *t) 335 - { 336 - struct fmdev *fmdev; 337 - struct sk_buff *skb; 338 - int len; 339 - 340 - fmdev = from_work(fmdev, t, tx_bh_work); 341 - 342 - if (!atomic_read(&fmdev->tx_cnt)) 343 - return; 344 - 345 - /* Check, is there any timeout happened to last transmitted packet */ 346 - if (time_is_before_jiffies(fmdev->last_tx_jiffies + FM_DRV_TX_TIMEOUT)) { 347 - fmerr("TX timeout occurred\n"); 348 - atomic_set(&fmdev->tx_cnt, 1); 349 - } 350 - 351 - /* Send queued FM TX packets */ 352 - skb = skb_dequeue(&fmdev->tx_q); 353 - if (!skb) 354 - return; 355 - 356 - atomic_dec(&fmdev->tx_cnt); 357 - fmdev->pre_op = fm_cb(skb)->fm_op; 358 - 359 - if (fmdev->resp_comp != NULL) 360 - fmerr("Response completion handler is not NULL\n"); 361 - 362 - fmdev->resp_comp = fm_cb(skb)->completion; 363 - 364 - /* Write FM packet to ST driver */ 365 - len = g_st_write(skb); 366 - if (len < 0) { 367 - kfree_skb(skb); 368 - fmdev->resp_comp = NULL; 369 - fmerr("TX bh work failed to send skb(%p)\n", skb); 370 - atomic_set(&fmdev->tx_cnt, 1); 371 - } else { 372 - fmdev->last_tx_jiffies = jiffies; 373 - } 374 - } 375 - 376 - /* 377 - * Queues FM Channel-8 packet to FM TX queue and schedules FM TX bh work for 378 - * transmission 379 - */ 380 - static int fm_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload, 381 - int payload_len, struct completion *wait_completion) 382 - { 383 - struct sk_buff *skb; 384 - struct fm_cmd_msg_hdr *hdr; 385 - int size; 386 - 387 - if (fm_op >= FM_INTERRUPT) { 388 - fmerr("Invalid fm opcode - %d\n", fm_op); 389 - return -EINVAL; 390 - } 391 - if (test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag) && payload == NULL) { 392 - fmerr("Payload data is NULL during fw download\n"); 393 - return -EINVAL; 394 - } 395 - if (!test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag)) 396 - size = 397 - FM_CMD_MSG_HDR_SIZE + ((payload == NULL) ? 0 : payload_len); 398 - else 399 - size = payload_len; 400 - 401 - skb = alloc_skb(size, GFP_ATOMIC); 402 - if (!skb) { 403 - fmerr("No memory to create new SKB\n"); 404 - return -ENOMEM; 405 - } 406 - /* 407 - * Don't fill FM header info for the commands which come from 408 - * FM firmware file. 409 - */ 410 - if (!test_bit(FM_FW_DW_INPROGRESS, &fmdev->flag) || 411 - test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) { 412 - /* Fill command header info */ 413 - hdr = skb_put(skb, FM_CMD_MSG_HDR_SIZE); 414 - hdr->hdr = FM_PKT_LOGICAL_CHAN_NUMBER; /* 0x08 */ 415 - 416 - /* 3 (fm_opcode,rd_wr,dlen) + payload len) */ 417 - hdr->len = ((payload == NULL) ? 0 : payload_len) + 3; 418 - 419 - /* FM opcode */ 420 - hdr->op = fm_op; 421 - 422 - /* read/write type */ 423 - hdr->rd_wr = type; 424 - hdr->dlen = payload_len; 425 - fm_cb(skb)->fm_op = fm_op; 426 - 427 - /* 428 - * If firmware download has finished and the command is 429 - * not a read command then payload is != NULL - a write 430 - * command with u16 payload - convert to be16 431 - */ 432 - if (payload != NULL) 433 - *(__be16 *)payload = cpu_to_be16(*(u16 *)payload); 434 - 435 - } else if (payload != NULL) { 436 - fm_cb(skb)->fm_op = *((u8 *)payload + 2); 437 - } 438 - if (payload != NULL) 439 - skb_put_data(skb, payload, payload_len); 440 - 441 - fm_cb(skb)->completion = wait_completion; 442 - skb_queue_tail(&fmdev->tx_q, skb); 443 - queue_work(system_bh_wq, &fmdev->tx_bh_work); 444 - 445 - return 0; 446 - } 447 - 448 - /* Sends FM Channel-8 command to the chip and waits for the response */ 449 - int fmc_send_cmd(struct fmdev *fmdev, u8 fm_op, u16 type, void *payload, 450 - unsigned int payload_len, void *response, int *response_len) 451 - { 452 - struct sk_buff *skb; 453 - struct fm_event_msg_hdr *evt_hdr; 454 - unsigned long flags; 455 - int ret; 456 - 457 - init_completion(&fmdev->maintask_comp); 458 - ret = fm_send_cmd(fmdev, fm_op, type, payload, payload_len, 459 - &fmdev->maintask_comp); 460 - if (ret) 461 - return ret; 462 - 463 - if (!wait_for_completion_timeout(&fmdev->maintask_comp, 464 - FM_DRV_TX_TIMEOUT)) { 465 - fmerr("Timeout(%d sec),didn't get regcompletion signal from RX bh work\n", 466 - jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); 467 - return -ETIMEDOUT; 468 - } 469 - spin_lock_irqsave(&fmdev->resp_skb_lock, flags); 470 - if (!fmdev->resp_skb) { 471 - spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); 472 - fmerr("Response SKB is missing\n"); 473 - return -EFAULT; 474 - } 475 - skb = fmdev->resp_skb; 476 - fmdev->resp_skb = NULL; 477 - spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); 478 - 479 - evt_hdr = (void *)skb->data; 480 - if (evt_hdr->status != 0) { 481 - fmerr("Received event pkt status(%d) is not zero\n", 482 - evt_hdr->status); 483 - kfree_skb(skb); 484 - return -EIO; 485 - } 486 - /* Send response data to caller */ 487 - if (response != NULL && response_len != NULL && evt_hdr->dlen && 488 - evt_hdr->dlen <= payload_len) { 489 - /* Skip header info and copy only response data */ 490 - skb_pull(skb, sizeof(struct fm_event_msg_hdr)); 491 - memcpy(response, skb->data, evt_hdr->dlen); 492 - *response_len = evt_hdr->dlen; 493 - } else if (response_len != NULL && evt_hdr->dlen == 0) { 494 - *response_len = 0; 495 - } 496 - kfree_skb(skb); 497 - 498 - return 0; 499 - } 500 - 501 - /* --- Helper functions used in FM interrupt handlers ---*/ 502 - static inline int check_cmdresp_status(struct fmdev *fmdev, 503 - struct sk_buff **skb) 504 - { 505 - struct fm_event_msg_hdr *fm_evt_hdr; 506 - unsigned long flags; 507 - 508 - del_timer(&fmdev->irq_info.timer); 509 - 510 - spin_lock_irqsave(&fmdev->resp_skb_lock, flags); 511 - *skb = fmdev->resp_skb; 512 - fmdev->resp_skb = NULL; 513 - spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags); 514 - 515 - fm_evt_hdr = (void *)(*skb)->data; 516 - if (fm_evt_hdr->status != 0) { 517 - fmerr("irq: opcode %x response status is not zero Initiating irq recovery process\n", 518 - fm_evt_hdr->op); 519 - 520 - mod_timer(&fmdev->irq_info.timer, jiffies + FM_DRV_TX_TIMEOUT); 521 - return -1; 522 - } 523 - 524 - return 0; 525 - } 526 - 527 - static inline void fm_irq_common_cmd_resp_helper(struct fmdev *fmdev, u8 stage) 528 - { 529 - struct sk_buff *skb; 530 - 531 - if (!check_cmdresp_status(fmdev, &skb)) 532 - fm_irq_call_stage(fmdev, stage); 533 - } 534 - 535 - /* 536 - * Interrupt process timeout handler. 537 - * One of the irq handler did not get proper response from the chip. So take 538 - * recovery action here. FM interrupts are disabled in the beginning of 539 - * interrupt process. Therefore reset stage index to re-enable default 540 - * interrupts. So that next interrupt will be processed as usual. 541 - */ 542 - static void int_timeout_handler(struct timer_list *t) 543 - { 544 - struct fmdev *fmdev; 545 - struct fm_irq *fmirq; 546 - 547 - fmdbg("irq: timeout,trying to re-enable fm interrupts\n"); 548 - fmdev = from_timer(fmdev, t, irq_info.timer); 549 - fmirq = &fmdev->irq_info; 550 - fmirq->retry++; 551 - 552 - if (fmirq->retry > FM_IRQ_TIMEOUT_RETRY_MAX) { 553 - /* Stop recovery action (interrupt reenable process) and 554 - * reset stage index & retry count values */ 555 - fmirq->stage = 0; 556 - fmirq->retry = 0; 557 - fmerr("Recovery action failed duringirq processing, max retry reached\n"); 558 - return; 559 - } 560 - fm_irq_call_stage(fmdev, FM_SEND_INTMSK_CMD_IDX); 561 - } 562 - 563 - /* --------- FM interrupt handlers ------------*/ 564 - static void fm_irq_send_flag_getcmd(struct fmdev *fmdev) 565 - { 566 - u16 flag; 567 - 568 - /* Send FLAG_GET command , to know the source of interrupt */ 569 - if (!fm_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, sizeof(flag), NULL)) 570 - fm_irq_timeout_stage(fmdev, FM_HANDLE_FLAG_GETCMD_RESP_IDX); 571 - } 572 - 573 - static void fm_irq_handle_flag_getcmd_resp(struct fmdev *fmdev) 574 - { 575 - struct sk_buff *skb; 576 - struct fm_event_msg_hdr *fm_evt_hdr; 577 - 578 - if (check_cmdresp_status(fmdev, &skb)) 579 - return; 580 - 581 - fm_evt_hdr = (void *)skb->data; 582 - if (fm_evt_hdr->dlen > sizeof(fmdev->irq_info.flag)) 583 - return; 584 - 585 - /* Skip header info and copy only response data */ 586 - skb_pull(skb, sizeof(struct fm_event_msg_hdr)); 587 - memcpy(&fmdev->irq_info.flag, skb->data, fm_evt_hdr->dlen); 588 - 589 - fmdev->irq_info.flag = be16_to_cpu((__force __be16)fmdev->irq_info.flag); 590 - fmdbg("irq: flag register(0x%x)\n", fmdev->irq_info.flag); 591 - 592 - /* Continue next function in interrupt handler table */ 593 - fm_irq_call_stage(fmdev, FM_HW_MAL_FUNC_IDX); 594 - } 595 - 596 - static void fm_irq_handle_hw_malfunction(struct fmdev *fmdev) 597 - { 598 - if (fmdev->irq_info.flag & FM_MAL_EVENT & fmdev->irq_info.mask) 599 - fmerr("irq: HW MAL int received - do nothing\n"); 600 - 601 - /* Continue next function in interrupt handler table */ 602 - fm_irq_call_stage(fmdev, FM_RDS_START_IDX); 603 - } 604 - 605 - static void fm_irq_handle_rds_start(struct fmdev *fmdev) 606 - { 607 - if (fmdev->irq_info.flag & FM_RDS_EVENT & fmdev->irq_info.mask) { 608 - fmdbg("irq: rds threshold reached\n"); 609 - fmdev->irq_info.stage = FM_RDS_SEND_RDS_GETCMD_IDX; 610 - } else { 611 - /* Continue next function in interrupt handler table */ 612 - fmdev->irq_info.stage = FM_HW_TUNE_OP_ENDED_IDX; 613 - } 614 - 615 - fm_irq_call(fmdev); 616 - } 617 - 618 - static void fm_irq_send_rdsdata_getcmd(struct fmdev *fmdev) 619 - { 620 - /* Send the command to read RDS data from the chip */ 621 - if (!fm_send_cmd(fmdev, RDS_DATA_GET, REG_RD, NULL, 622 - (FM_RX_RDS_FIFO_THRESHOLD * 3), NULL)) 623 - fm_irq_timeout_stage(fmdev, FM_RDS_HANDLE_RDS_GETCMD_RESP_IDX); 624 - } 625 - 626 - /* Keeps track of current RX channel AF (Alternate Frequency) */ 627 - static void fm_rx_update_af_cache(struct fmdev *fmdev, u8 af) 628 - { 629 - struct tuned_station_info *stat_info = &fmdev->rx.stat_info; 630 - u8 reg_idx = fmdev->rx.region.fm_band; 631 - u8 index; 632 - u32 freq; 633 - 634 - /* First AF indicates the number of AF follows. Reset the list */ 635 - if ((af >= FM_RDS_1_AF_FOLLOWS) && (af <= FM_RDS_25_AF_FOLLOWS)) { 636 - fmdev->rx.stat_info.af_list_max = (af - FM_RDS_1_AF_FOLLOWS + 1); 637 - fmdev->rx.stat_info.afcache_size = 0; 638 - fmdbg("No of expected AF : %d\n", fmdev->rx.stat_info.af_list_max); 639 - return; 640 - } 641 - 642 - if (af < FM_RDS_MIN_AF) 643 - return; 644 - if (reg_idx == FM_BAND_EUROPE_US && af > FM_RDS_MAX_AF) 645 - return; 646 - if (reg_idx == FM_BAND_JAPAN && af > FM_RDS_MAX_AF_JAPAN) 647 - return; 648 - 649 - freq = fmdev->rx.region.bot_freq + (af * 100); 650 - if (freq == fmdev->rx.freq) { 651 - fmdbg("Current freq(%d) is matching with received AF(%d)\n", 652 - fmdev->rx.freq, freq); 653 - return; 654 - } 655 - /* Do check in AF cache */ 656 - for (index = 0; index < stat_info->afcache_size; index++) { 657 - if (stat_info->af_cache[index] == freq) 658 - break; 659 - } 660 - /* Reached the limit of the list - ignore the next AF */ 661 - if (index == stat_info->af_list_max) { 662 - fmdbg("AF cache is full\n"); 663 - return; 664 - } 665 - /* 666 - * If we reached the end of the list then this AF is not 667 - * in the list - add it. 668 - */ 669 - if (index == stat_info->afcache_size) { 670 - fmdbg("Storing AF %d to cache index %d\n", freq, index); 671 - stat_info->af_cache[index] = freq; 672 - stat_info->afcache_size++; 673 - } 674 - } 675 - 676 - /* 677 - * Converts RDS buffer data from big endian format 678 - * to little endian format. 679 - */ 680 - static void fm_rdsparse_swapbytes(struct fmdev *fmdev, 681 - struct fm_rdsdata_format *rds_format) 682 - { 683 - u8 index = 0; 684 - u8 *rds_buff; 685 - 686 - /* 687 - * Since in Orca the 2 RDS Data bytes are in little endian and 688 - * in Dolphin they are in big endian, the parsing of the RDS data 689 - * is chip dependent 690 - */ 691 - if (fmdev->asci_id != 0x6350) { 692 - rds_buff = &rds_format->data.groupdatabuff.buff[0]; 693 - while (index + 1 < FM_RX_RDS_INFO_FIELD_MAX) { 694 - swap(rds_buff[index], rds_buff[index + 1]); 695 - index += 2; 696 - } 697 - } 698 - } 699 - 700 - static void fm_irq_handle_rdsdata_getcmd_resp(struct fmdev *fmdev) 701 - { 702 - struct sk_buff *skb; 703 - struct fm_rdsdata_format rds_fmt; 704 - struct fm_rds *rds = &fmdev->rx.rds; 705 - unsigned long group_idx, flags; 706 - u8 *rds_data, meta_data, tmpbuf[FM_RDS_BLK_SIZE]; 707 - u8 type, blk_idx, idx; 708 - u16 cur_picode; 709 - u32 rds_len; 710 - 711 - if (check_cmdresp_status(fmdev, &skb)) 712 - return; 713 - 714 - /* Skip header info */ 715 - skb_pull(skb, sizeof(struct fm_event_msg_hdr)); 716 - rds_data = skb->data; 717 - rds_len = skb->len; 718 - 719 - /* Parse the RDS data */ 720 - while (rds_len >= FM_RDS_BLK_SIZE) { 721 - meta_data = rds_data[2]; 722 - /* Get the type: 0=A, 1=B, 2=C, 3=C', 4=D, 5=E */ 723 - type = (meta_data & 0x07); 724 - 725 - /* Transform the blk type into index sequence (0, 1, 2, 3, 4) */ 726 - blk_idx = (type <= FM_RDS_BLOCK_C ? type : (type - 1)); 727 - fmdbg("Block index:%d(%s)\n", blk_idx, 728 - (meta_data & FM_RDS_STATUS_ERR_MASK) ? "Bad" : "Ok"); 729 - 730 - if ((meta_data & FM_RDS_STATUS_ERR_MASK) != 0) 731 - break; 732 - 733 - if (blk_idx > FM_RDS_BLK_IDX_D) { 734 - fmdbg("Block sequence mismatch\n"); 735 - rds->last_blk_idx = -1; 736 - break; 737 - } 738 - 739 - /* Skip checkword (control) byte and copy only data byte */ 740 - idx = array_index_nospec(blk_idx * (FM_RDS_BLK_SIZE - 1), 741 - FM_RX_RDS_INFO_FIELD_MAX - (FM_RDS_BLK_SIZE - 1)); 742 - 743 - memcpy(&rds_fmt.data.groupdatabuff.buff[idx], rds_data, 744 - FM_RDS_BLK_SIZE - 1); 745 - 746 - rds->last_blk_idx = blk_idx; 747 - 748 - /* If completed a whole group then handle it */ 749 - if (blk_idx == FM_RDS_BLK_IDX_D) { 750 - fmdbg("Good block received\n"); 751 - fm_rdsparse_swapbytes(fmdev, &rds_fmt); 752 - 753 - /* 754 - * Extract PI code and store in local cache. 755 - * We need this during AF switch processing. 756 - */ 757 - cur_picode = be16_to_cpu((__force __be16)rds_fmt.data.groupgeneral.pidata); 758 - if (fmdev->rx.stat_info.picode != cur_picode) 759 - fmdev->rx.stat_info.picode = cur_picode; 760 - 761 - fmdbg("picode:%d\n", cur_picode); 762 - 763 - group_idx = (rds_fmt.data.groupgeneral.blk_b[0] >> 3); 764 - fmdbg("(fmdrv):Group:%ld%s\n", group_idx/2, 765 - (group_idx % 2) ? "B" : "A"); 766 - 767 - group_idx = 1 << (rds_fmt.data.groupgeneral.blk_b[0] >> 3); 768 - if (group_idx == FM_RDS_GROUP_TYPE_MASK_0A) { 769 - fm_rx_update_af_cache(fmdev, rds_fmt.data.group0A.af[0]); 770 - fm_rx_update_af_cache(fmdev, rds_fmt.data.group0A.af[1]); 771 - } 772 - } 773 - rds_len -= FM_RDS_BLK_SIZE; 774 - rds_data += FM_RDS_BLK_SIZE; 775 - } 776 - 777 - /* Copy raw rds data to internal rds buffer */ 778 - rds_data = skb->data; 779 - rds_len = skb->len; 780 - 781 - spin_lock_irqsave(&fmdev->rds_buff_lock, flags); 782 - while (rds_len > 0) { 783 - /* 784 - * Fill RDS buffer as per V4L2 specification. 785 - * Store control byte 786 - */ 787 - type = (rds_data[2] & 0x07); 788 - blk_idx = (type <= FM_RDS_BLOCK_C ? type : (type - 1)); 789 - tmpbuf[2] = blk_idx; /* Offset name */ 790 - tmpbuf[2] |= blk_idx << 3; /* Received offset */ 791 - 792 - /* Store data byte */ 793 - tmpbuf[0] = rds_data[0]; 794 - tmpbuf[1] = rds_data[1]; 795 - 796 - memcpy(&rds->buff[rds->wr_idx], &tmpbuf, FM_RDS_BLK_SIZE); 797 - rds->wr_idx = (rds->wr_idx + FM_RDS_BLK_SIZE) % rds->buf_size; 798 - 799 - /* Check for overflow & start over */ 800 - if (rds->wr_idx == rds->rd_idx) { 801 - fmdbg("RDS buffer overflow\n"); 802 - rds->wr_idx = 0; 803 - rds->rd_idx = 0; 804 - break; 805 - } 806 - rds_len -= FM_RDS_BLK_SIZE; 807 - rds_data += FM_RDS_BLK_SIZE; 808 - } 809 - spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags); 810 - 811 - /* Wakeup read queue */ 812 - if (rds->wr_idx != rds->rd_idx) 813 - wake_up_interruptible(&rds->read_queue); 814 - 815 - fm_irq_call_stage(fmdev, FM_RDS_FINISH_IDX); 816 - } 817 - 818 - static void fm_irq_handle_rds_finish(struct fmdev *fmdev) 819 - { 820 - fm_irq_call_stage(fmdev, FM_HW_TUNE_OP_ENDED_IDX); 821 - } 822 - 823 - static void fm_irq_handle_tune_op_ended(struct fmdev *fmdev) 824 - { 825 - if (fmdev->irq_info.flag & (FM_FR_EVENT | FM_BL_EVENT) & fmdev-> 826 - irq_info.mask) { 827 - fmdbg("irq: tune ended/bandlimit reached\n"); 828 - if (test_and_clear_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag)) { 829 - fmdev->irq_info.stage = FM_AF_JUMP_RD_FREQ_IDX; 830 - } else { 831 - complete(&fmdev->maintask_comp); 832 - fmdev->irq_info.stage = FM_HW_POWER_ENB_IDX; 833 - } 834 - } else 835 - fmdev->irq_info.stage = FM_HW_POWER_ENB_IDX; 836 - 837 - fm_irq_call(fmdev); 838 - } 839 - 840 - static void fm_irq_handle_power_enb(struct fmdev *fmdev) 841 - { 842 - if (fmdev->irq_info.flag & FM_POW_ENB_EVENT) { 843 - fmdbg("irq: Power Enabled/Disabled\n"); 844 - complete(&fmdev->maintask_comp); 845 - } 846 - 847 - fm_irq_call_stage(fmdev, FM_LOW_RSSI_START_IDX); 848 - } 849 - 850 - static void fm_irq_handle_low_rssi_start(struct fmdev *fmdev) 851 - { 852 - if ((fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) && 853 - (fmdev->irq_info.flag & FM_LEV_EVENT & fmdev->irq_info.mask) && 854 - (fmdev->rx.freq != FM_UNDEFINED_FREQ) && 855 - (fmdev->rx.stat_info.afcache_size != 0)) { 856 - fmdbg("irq: rssi level has fallen below threshold level\n"); 857 - 858 - /* Disable further low RSSI interrupts */ 859 - fmdev->irq_info.mask &= ~FM_LEV_EVENT; 860 - 861 - fmdev->rx.afjump_idx = 0; 862 - fmdev->rx.freq_before_jump = fmdev->rx.freq; 863 - fmdev->irq_info.stage = FM_AF_JUMP_SETPI_IDX; 864 - } else { 865 - /* Continue next function in interrupt handler table */ 866 - fmdev->irq_info.stage = FM_SEND_INTMSK_CMD_IDX; 867 - } 868 - 869 - fm_irq_call(fmdev); 870 - } 871 - 872 - static void fm_irq_afjump_set_pi(struct fmdev *fmdev) 873 - { 874 - u16 payload; 875 - 876 - /* Set PI code - must be updated if the AF list is not empty */ 877 - payload = fmdev->rx.stat_info.picode; 878 - if (!fm_send_cmd(fmdev, RDS_PI_SET, REG_WR, &payload, sizeof(payload), NULL)) 879 - fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SETPI_RESP_IDX); 880 - } 881 - 882 - static void fm_irq_handle_set_pi_resp(struct fmdev *fmdev) 883 - { 884 - fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_SETPI_MASK_IDX); 885 - } 886 - 887 - /* 888 - * Set PI mask. 889 - * 0xFFFF = Enable PI code matching 890 - * 0x0000 = Disable PI code matching 891 - */ 892 - static void fm_irq_afjump_set_pimask(struct fmdev *fmdev) 893 - { 894 - u16 payload; 895 - 896 - payload = 0x0000; 897 - if (!fm_send_cmd(fmdev, RDS_PI_MASK_SET, REG_WR, &payload, sizeof(payload), NULL)) 898 - fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SETPI_MASK_RESP_IDX); 899 - } 900 - 901 - static void fm_irq_handle_set_pimask_resp(struct fmdev *fmdev) 902 - { 903 - fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_SET_AF_FREQ_IDX); 904 - } 905 - 906 - static void fm_irq_afjump_setfreq(struct fmdev *fmdev) 907 - { 908 - u16 frq_index; 909 - u16 payload; 910 - 911 - fmdbg("Switch to %d KHz\n", fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx]); 912 - frq_index = (fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx] - 913 - fmdev->rx.region.bot_freq) / FM_FREQ_MUL; 914 - 915 - payload = frq_index; 916 - if (!fm_send_cmd(fmdev, AF_FREQ_SET, REG_WR, &payload, sizeof(payload), NULL)) 917 - fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_SET_AFFREQ_RESP_IDX); 918 - } 919 - 920 - static void fm_irq_handle_setfreq_resp(struct fmdev *fmdev) 921 - { 922 - fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_ENABLE_INT_IDX); 923 - } 924 - 925 - static void fm_irq_afjump_enableint(struct fmdev *fmdev) 926 - { 927 - u16 payload; 928 - 929 - /* Enable FR (tuning operation ended) interrupt */ 930 - payload = FM_FR_EVENT; 931 - if (!fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, sizeof(payload), NULL)) 932 - fm_irq_timeout_stage(fmdev, FM_AF_JUMP_ENABLE_INT_RESP_IDX); 933 - } 934 - 935 - static void fm_irq_afjump_enableint_resp(struct fmdev *fmdev) 936 - { 937 - fm_irq_common_cmd_resp_helper(fmdev, FM_AF_JUMP_START_AFJUMP_IDX); 938 - } 939 - 940 - static void fm_irq_start_afjump(struct fmdev *fmdev) 941 - { 942 - u16 payload; 943 - 944 - payload = FM_TUNER_AF_JUMP_MODE; 945 - if (!fm_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload, 946 - sizeof(payload), NULL)) 947 - fm_irq_timeout_stage(fmdev, FM_AF_JUMP_HANDLE_START_AFJUMP_RESP_IDX); 948 - } 949 - 950 - static void fm_irq_handle_start_afjump_resp(struct fmdev *fmdev) 951 - { 952 - struct sk_buff *skb; 953 - 954 - if (check_cmdresp_status(fmdev, &skb)) 955 - return; 956 - 957 - fmdev->irq_info.stage = FM_SEND_FLAG_GETCMD_IDX; 958 - set_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag); 959 - clear_bit(FM_INTTASK_RUNNING, &fmdev->flag); 960 - } 961 - 962 - static void fm_irq_afjump_rd_freq(struct fmdev *fmdev) 963 - { 964 - u16 payload; 965 - 966 - if (!fm_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, sizeof(payload), NULL)) 967 - fm_irq_timeout_stage(fmdev, FM_AF_JUMP_RD_FREQ_RESP_IDX); 968 - } 969 - 970 - static void fm_irq_afjump_rd_freq_resp(struct fmdev *fmdev) 971 - { 972 - struct sk_buff *skb; 973 - u16 read_freq; 974 - u32 curr_freq, jumped_freq; 975 - 976 - if (check_cmdresp_status(fmdev, &skb)) 977 - return; 978 - 979 - /* Skip header info and copy only response data */ 980 - skb_pull(skb, sizeof(struct fm_event_msg_hdr)); 981 - memcpy(&read_freq, skb->data, sizeof(read_freq)); 982 - read_freq = be16_to_cpu((__force __be16)read_freq); 983 - curr_freq = fmdev->rx.region.bot_freq + ((u32)read_freq * FM_FREQ_MUL); 984 - 985 - jumped_freq = fmdev->rx.stat_info.af_cache[fmdev->rx.afjump_idx]; 986 - 987 - /* If the frequency was changed the jump succeeded */ 988 - if ((curr_freq != fmdev->rx.freq_before_jump) && (curr_freq == jumped_freq)) { 989 - fmdbg("Successfully switched to alternate freq %d\n", curr_freq); 990 - fmdev->rx.freq = curr_freq; 991 - fm_rx_reset_rds_cache(fmdev); 992 - 993 - /* AF feature is on, enable low level RSSI interrupt */ 994 - if (fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) 995 - fmdev->irq_info.mask |= FM_LEV_EVENT; 996 - 997 - fmdev->irq_info.stage = FM_LOW_RSSI_FINISH_IDX; 998 - } else { /* jump to the next freq in the AF list */ 999 - fmdev->rx.afjump_idx++; 1000 - 1001 - /* If we reached the end of the list - stop searching */ 1002 - if (fmdev->rx.afjump_idx >= fmdev->rx.stat_info.afcache_size) { 1003 - fmdbg("AF switch processing failed\n"); 1004 - fmdev->irq_info.stage = FM_LOW_RSSI_FINISH_IDX; 1005 - } else { /* AF List is not over - try next one */ 1006 - 1007 - fmdbg("Trying next freq in AF cache\n"); 1008 - fmdev->irq_info.stage = FM_AF_JUMP_SETPI_IDX; 1009 - } 1010 - } 1011 - fm_irq_call(fmdev); 1012 - } 1013 - 1014 - static void fm_irq_handle_low_rssi_finish(struct fmdev *fmdev) 1015 - { 1016 - fm_irq_call_stage(fmdev, FM_SEND_INTMSK_CMD_IDX); 1017 - } 1018 - 1019 - static void fm_irq_send_intmsk_cmd(struct fmdev *fmdev) 1020 - { 1021 - u16 payload; 1022 - 1023 - /* Re-enable FM interrupts */ 1024 - payload = fmdev->irq_info.mask; 1025 - 1026 - if (!fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 1027 - sizeof(payload), NULL)) 1028 - fm_irq_timeout_stage(fmdev, FM_HANDLE_INTMSK_CMD_RESP_IDX); 1029 - } 1030 - 1031 - static void fm_irq_handle_intmsk_cmd_resp(struct fmdev *fmdev) 1032 - { 1033 - struct sk_buff *skb; 1034 - 1035 - if (check_cmdresp_status(fmdev, &skb)) 1036 - return; 1037 - /* 1038 - * This is last function in interrupt table to be executed. 1039 - * So, reset stage index to 0. 1040 - */ 1041 - fmdev->irq_info.stage = FM_SEND_FLAG_GETCMD_IDX; 1042 - 1043 - /* Start processing any pending interrupt */ 1044 - if (test_and_clear_bit(FM_INTTASK_SCHEDULE_PENDING, &fmdev->flag)) 1045 - fmdev->irq_info.handlers[fmdev->irq_info.stage](fmdev); 1046 - else 1047 - clear_bit(FM_INTTASK_RUNNING, &fmdev->flag); 1048 - } 1049 - 1050 - /* Returns availability of RDS data in internal buffer */ 1051 - int fmc_is_rds_data_available(struct fmdev *fmdev, struct file *file, 1052 - struct poll_table_struct *pts) 1053 - { 1054 - poll_wait(file, &fmdev->rx.rds.read_queue, pts); 1055 - if (fmdev->rx.rds.rd_idx != fmdev->rx.rds.wr_idx) 1056 - return 0; 1057 - 1058 - return -EAGAIN; 1059 - } 1060 - 1061 - /* Copies RDS data from internal buffer to user buffer */ 1062 - int fmc_transfer_rds_from_internal_buff(struct fmdev *fmdev, struct file *file, 1063 - u8 __user *buf, size_t count) 1064 - { 1065 - u32 block_count; 1066 - u8 tmpbuf[FM_RDS_BLK_SIZE]; 1067 - unsigned long flags; 1068 - int ret; 1069 - 1070 - if (fmdev->rx.rds.wr_idx == fmdev->rx.rds.rd_idx) { 1071 - if (file->f_flags & O_NONBLOCK) 1072 - return -EWOULDBLOCK; 1073 - 1074 - ret = wait_event_interruptible(fmdev->rx.rds.read_queue, 1075 - (fmdev->rx.rds.wr_idx != fmdev->rx.rds.rd_idx)); 1076 - if (ret) 1077 - return -EINTR; 1078 - } 1079 - 1080 - /* Calculate block count from byte count */ 1081 - count /= FM_RDS_BLK_SIZE; 1082 - block_count = 0; 1083 - ret = 0; 1084 - 1085 - while (block_count < count) { 1086 - spin_lock_irqsave(&fmdev->rds_buff_lock, flags); 1087 - 1088 - if (fmdev->rx.rds.wr_idx == fmdev->rx.rds.rd_idx) { 1089 - spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags); 1090 - break; 1091 - } 1092 - memcpy(tmpbuf, &fmdev->rx.rds.buff[fmdev->rx.rds.rd_idx], 1093 - FM_RDS_BLK_SIZE); 1094 - fmdev->rx.rds.rd_idx += FM_RDS_BLK_SIZE; 1095 - if (fmdev->rx.rds.rd_idx >= fmdev->rx.rds.buf_size) 1096 - fmdev->rx.rds.rd_idx = 0; 1097 - 1098 - spin_unlock_irqrestore(&fmdev->rds_buff_lock, flags); 1099 - 1100 - if (copy_to_user(buf, tmpbuf, FM_RDS_BLK_SIZE)) 1101 - break; 1102 - 1103 - block_count++; 1104 - buf += FM_RDS_BLK_SIZE; 1105 - ret += FM_RDS_BLK_SIZE; 1106 - } 1107 - return ret; 1108 - } 1109 - 1110 - int fmc_set_freq(struct fmdev *fmdev, u32 freq_to_set) 1111 - { 1112 - switch (fmdev->curr_fmmode) { 1113 - case FM_MODE_RX: 1114 - return fm_rx_set_freq(fmdev, freq_to_set); 1115 - 1116 - case FM_MODE_TX: 1117 - return fm_tx_set_freq(fmdev, freq_to_set); 1118 - 1119 - default: 1120 - return -EINVAL; 1121 - } 1122 - } 1123 - 1124 - int fmc_get_freq(struct fmdev *fmdev, u32 *cur_tuned_frq) 1125 - { 1126 - if (fmdev->rx.freq == FM_UNDEFINED_FREQ) { 1127 - fmerr("RX frequency is not set\n"); 1128 - return -EPERM; 1129 - } 1130 - if (cur_tuned_frq == NULL) { 1131 - fmerr("Invalid memory\n"); 1132 - return -ENOMEM; 1133 - } 1134 - 1135 - switch (fmdev->curr_fmmode) { 1136 - case FM_MODE_RX: 1137 - *cur_tuned_frq = fmdev->rx.freq; 1138 - return 0; 1139 - 1140 - case FM_MODE_TX: 1141 - *cur_tuned_frq = 0; /* TODO : Change this later */ 1142 - return 0; 1143 - 1144 - default: 1145 - return -EINVAL; 1146 - } 1147 - 1148 - } 1149 - 1150 - int fmc_set_region(struct fmdev *fmdev, u8 region_to_set) 1151 - { 1152 - switch (fmdev->curr_fmmode) { 1153 - case FM_MODE_RX: 1154 - return fm_rx_set_region(fmdev, region_to_set); 1155 - 1156 - case FM_MODE_TX: 1157 - return fm_tx_set_region(fmdev, region_to_set); 1158 - 1159 - default: 1160 - return -EINVAL; 1161 - } 1162 - } 1163 - 1164 - int fmc_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset) 1165 - { 1166 - switch (fmdev->curr_fmmode) { 1167 - case FM_MODE_RX: 1168 - return fm_rx_set_mute_mode(fmdev, mute_mode_toset); 1169 - 1170 - case FM_MODE_TX: 1171 - return fm_tx_set_mute_mode(fmdev, mute_mode_toset); 1172 - 1173 - default: 1174 - return -EINVAL; 1175 - } 1176 - } 1177 - 1178 - int fmc_set_stereo_mono(struct fmdev *fmdev, u16 mode) 1179 - { 1180 - switch (fmdev->curr_fmmode) { 1181 - case FM_MODE_RX: 1182 - return fm_rx_set_stereo_mono(fmdev, mode); 1183 - 1184 - case FM_MODE_TX: 1185 - return fm_tx_set_stereo_mono(fmdev, mode); 1186 - 1187 - default: 1188 - return -EINVAL; 1189 - } 1190 - } 1191 - 1192 - int fmc_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis) 1193 - { 1194 - switch (fmdev->curr_fmmode) { 1195 - case FM_MODE_RX: 1196 - return fm_rx_set_rds_mode(fmdev, rds_en_dis); 1197 - 1198 - case FM_MODE_TX: 1199 - return fm_tx_set_rds_mode(fmdev, rds_en_dis); 1200 - 1201 - default: 1202 - return -EINVAL; 1203 - } 1204 - } 1205 - 1206 - /* Sends power off command to the chip */ 1207 - static int fm_power_down(struct fmdev *fmdev) 1208 - { 1209 - u16 payload; 1210 - int ret; 1211 - 1212 - if (!test_bit(FM_CORE_READY, &fmdev->flag)) { 1213 - fmerr("FM core is not ready\n"); 1214 - return -EPERM; 1215 - } 1216 - if (fmdev->curr_fmmode == FM_MODE_OFF) { 1217 - fmdbg("FM chip is already in OFF state\n"); 1218 - return 0; 1219 - } 1220 - 1221 - payload = 0x0; 1222 - ret = fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload, 1223 - sizeof(payload), NULL, NULL); 1224 - if (ret < 0) 1225 - return ret; 1226 - 1227 - return fmc_release(fmdev); 1228 - } 1229 - 1230 - /* Reads init command from FM firmware file and loads to the chip */ 1231 - static int fm_download_firmware(struct fmdev *fmdev, const u8 *fw_name) 1232 - { 1233 - const struct firmware *fw_entry; 1234 - struct bts_header *fw_header; 1235 - struct bts_action *action; 1236 - struct bts_action_delay *delay; 1237 - u8 *fw_data; 1238 - int ret, fw_len; 1239 - 1240 - set_bit(FM_FW_DW_INPROGRESS, &fmdev->flag); 1241 - 1242 - ret = request_firmware(&fw_entry, fw_name, 1243 - &fmdev->radio_dev->dev); 1244 - if (ret < 0) { 1245 - fmerr("Unable to read firmware(%s) content\n", fw_name); 1246 - return ret; 1247 - } 1248 - fmdbg("Firmware(%s) length : %zu bytes\n", fw_name, fw_entry->size); 1249 - 1250 - fw_data = (void *)fw_entry->data; 1251 - fw_len = fw_entry->size; 1252 - 1253 - fw_header = (struct bts_header *)fw_data; 1254 - if (fw_header->magic != FM_FW_FILE_HEADER_MAGIC) { 1255 - fmerr("%s not a legal TI firmware file\n", fw_name); 1256 - ret = -EINVAL; 1257 - goto rel_fw; 1258 - } 1259 - fmdbg("FW(%s) magic number : 0x%x\n", fw_name, fw_header->magic); 1260 - 1261 - /* Skip file header info , we already verified it */ 1262 - fw_data += sizeof(struct bts_header); 1263 - fw_len -= sizeof(struct bts_header); 1264 - 1265 - while (fw_data && fw_len > 0) { 1266 - action = (struct bts_action *)fw_data; 1267 - 1268 - switch (action->type) { 1269 - case ACTION_SEND_COMMAND: /* Send */ 1270 - ret = fmc_send_cmd(fmdev, 0, 0, action->data, 1271 - action->size, NULL, NULL); 1272 - if (ret) 1273 - goto rel_fw; 1274 - 1275 - break; 1276 - 1277 - case ACTION_DELAY: /* Delay */ 1278 - delay = (struct bts_action_delay *)action->data; 1279 - mdelay(delay->msec); 1280 - break; 1281 - } 1282 - 1283 - fw_data += (sizeof(struct bts_action) + (action->size)); 1284 - fw_len -= (sizeof(struct bts_action) + (action->size)); 1285 - } 1286 - fmdbg("Transferred only %d of %d bytes of the firmware to chip\n", 1287 - fw_entry->size - fw_len, fw_entry->size); 1288 - rel_fw: 1289 - release_firmware(fw_entry); 1290 - clear_bit(FM_FW_DW_INPROGRESS, &fmdev->flag); 1291 - 1292 - return ret; 1293 - } 1294 - 1295 - /* Loads default RX configuration to the chip */ 1296 - static int load_default_rx_configuration(struct fmdev *fmdev) 1297 - { 1298 - int ret; 1299 - 1300 - ret = fm_rx_set_volume(fmdev, FM_DEFAULT_RX_VOLUME); 1301 - if (ret < 0) 1302 - return ret; 1303 - 1304 - return fm_rx_set_rssi_threshold(fmdev, FM_DEFAULT_RSSI_THRESHOLD); 1305 - } 1306 - 1307 - /* Does FM power on sequence */ 1308 - static int fm_power_up(struct fmdev *fmdev, u8 mode) 1309 - { 1310 - u16 payload; 1311 - __be16 asic_id = 0, asic_ver = 0; 1312 - int resp_len, ret; 1313 - u8 fw_name[50]; 1314 - 1315 - if (mode >= FM_MODE_ENTRY_MAX) { 1316 - fmerr("Invalid firmware download option\n"); 1317 - return -EINVAL; 1318 - } 1319 - 1320 - /* 1321 - * Initialize FM common module. FM GPIO toggling is 1322 - * taken care in Shared Transport driver. 1323 - */ 1324 - ret = fmc_prepare(fmdev); 1325 - if (ret < 0) { 1326 - fmerr("Unable to prepare FM Common\n"); 1327 - return ret; 1328 - } 1329 - 1330 - payload = FM_ENABLE; 1331 - if (fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload, 1332 - sizeof(payload), NULL, NULL)) 1333 - goto rel; 1334 - 1335 - /* Allow the chip to settle down in Channel-8 mode */ 1336 - msleep(20); 1337 - 1338 - if (fmc_send_cmd(fmdev, ASIC_ID_GET, REG_RD, NULL, 1339 - sizeof(asic_id), &asic_id, &resp_len)) 1340 - goto rel; 1341 - 1342 - if (fmc_send_cmd(fmdev, ASIC_VER_GET, REG_RD, NULL, 1343 - sizeof(asic_ver), &asic_ver, &resp_len)) 1344 - goto rel; 1345 - 1346 - fmdbg("ASIC ID: 0x%x , ASIC Version: %d\n", 1347 - be16_to_cpu(asic_id), be16_to_cpu(asic_ver)); 1348 - 1349 - sprintf(fw_name, "%s_%x.%d.bts", FM_FMC_FW_FILE_START, 1350 - be16_to_cpu(asic_id), be16_to_cpu(asic_ver)); 1351 - 1352 - ret = fm_download_firmware(fmdev, fw_name); 1353 - if (ret < 0) { 1354 - fmdbg("Failed to download firmware file %s\n", fw_name); 1355 - goto rel; 1356 - } 1357 - sprintf(fw_name, "%s_%x.%d.bts", (mode == FM_MODE_RX) ? 1358 - FM_RX_FW_FILE_START : FM_TX_FW_FILE_START, 1359 - be16_to_cpu(asic_id), be16_to_cpu(asic_ver)); 1360 - 1361 - ret = fm_download_firmware(fmdev, fw_name); 1362 - if (ret < 0) { 1363 - fmdbg("Failed to download firmware file %s\n", fw_name); 1364 - goto rel; 1365 - } else 1366 - return ret; 1367 - rel: 1368 - return fmc_release(fmdev); 1369 - } 1370 - 1371 - /* Set FM Modes(TX, RX, OFF) */ 1372 - int fmc_set_mode(struct fmdev *fmdev, u8 fm_mode) 1373 - { 1374 - int ret = 0; 1375 - 1376 - if (fm_mode >= FM_MODE_ENTRY_MAX) { 1377 - fmerr("Invalid FM mode\n"); 1378 - return -EINVAL; 1379 - } 1380 - if (fmdev->curr_fmmode == fm_mode) { 1381 - fmdbg("Already fm is in mode(%d)\n", fm_mode); 1382 - return ret; 1383 - } 1384 - 1385 - switch (fm_mode) { 1386 - case FM_MODE_OFF: /* OFF Mode */ 1387 - ret = fm_power_down(fmdev); 1388 - if (ret < 0) { 1389 - fmerr("Failed to set OFF mode\n"); 1390 - return ret; 1391 - } 1392 - break; 1393 - 1394 - case FM_MODE_TX: /* TX Mode */ 1395 - case FM_MODE_RX: /* RX Mode */ 1396 - /* Power down before switching to TX or RX mode */ 1397 - if (fmdev->curr_fmmode != FM_MODE_OFF) { 1398 - ret = fm_power_down(fmdev); 1399 - if (ret < 0) { 1400 - fmerr("Failed to set OFF mode\n"); 1401 - return ret; 1402 - } 1403 - msleep(30); 1404 - } 1405 - ret = fm_power_up(fmdev, fm_mode); 1406 - if (ret < 0) { 1407 - fmerr("Failed to load firmware\n"); 1408 - return ret; 1409 - } 1410 - } 1411 - fmdev->curr_fmmode = fm_mode; 1412 - 1413 - /* Set default configuration */ 1414 - if (fmdev->curr_fmmode == FM_MODE_RX) { 1415 - fmdbg("Loading default rx configuration..\n"); 1416 - ret = load_default_rx_configuration(fmdev); 1417 - if (ret < 0) 1418 - fmerr("Failed to load default values\n"); 1419 - } 1420 - 1421 - return ret; 1422 - } 1423 - 1424 - /* Returns current FM mode (TX, RX, OFF) */ 1425 - int fmc_get_mode(struct fmdev *fmdev, u8 *fmmode) 1426 - { 1427 - if (!test_bit(FM_CORE_READY, &fmdev->flag)) { 1428 - fmerr("FM core is not ready\n"); 1429 - return -EPERM; 1430 - } 1431 - if (fmmode == NULL) { 1432 - fmerr("Invalid memory\n"); 1433 - return -ENOMEM; 1434 - } 1435 - 1436 - *fmmode = fmdev->curr_fmmode; 1437 - return 0; 1438 - } 1439 - 1440 - /* Called by ST layer when FM packet is available */ 1441 - static long fm_st_receive(void *arg, struct sk_buff *skb) 1442 - { 1443 - struct fmdev *fmdev; 1444 - 1445 - fmdev = arg; 1446 - 1447 - if (skb == NULL) { 1448 - fmerr("Invalid SKB received from ST\n"); 1449 - return -EFAULT; 1450 - } 1451 - 1452 - if (skb->cb[0] != FM_PKT_LOGICAL_CHAN_NUMBER) { 1453 - fmerr("Received SKB (%p) is not FM Channel 8 pkt\n", skb); 1454 - return -EINVAL; 1455 - } 1456 - 1457 - memcpy(skb_push(skb, 1), &skb->cb[0], 1); 1458 - skb_queue_tail(&fmdev->rx_q, skb); 1459 - queue_work(system_bh_wq, &fmdev->rx_bh_work); 1460 - 1461 - return 0; 1462 - } 1463 - 1464 - /* 1465 - * Called by ST layer to indicate protocol registration completion 1466 - * status. 1467 - */ 1468 - static void fm_st_reg_comp_cb(void *arg, int data) 1469 - { 1470 - struct fmdev *fmdev; 1471 - 1472 - fmdev = (struct fmdev *)arg; 1473 - fmdev->streg_cbdata = data; 1474 - complete(&wait_for_fmdrv_reg_comp); 1475 - } 1476 - 1477 - /* 1478 - * This function will be called from FM V4L2 open function. 1479 - * Register with ST driver and initialize driver data. 1480 - */ 1481 - int fmc_prepare(struct fmdev *fmdev) 1482 - { 1483 - static struct st_proto_s fm_st_proto; 1484 - int ret; 1485 - 1486 - if (test_bit(FM_CORE_READY, &fmdev->flag)) { 1487 - fmdbg("FM Core is already up\n"); 1488 - return 0; 1489 - } 1490 - 1491 - memset(&fm_st_proto, 0, sizeof(fm_st_proto)); 1492 - fm_st_proto.recv = fm_st_receive; 1493 - fm_st_proto.match_packet = NULL; 1494 - fm_st_proto.reg_complete_cb = fm_st_reg_comp_cb; 1495 - fm_st_proto.write = NULL; /* TI ST driver will fill write pointer */ 1496 - fm_st_proto.priv_data = fmdev; 1497 - fm_st_proto.chnl_id = 0x08; 1498 - fm_st_proto.max_frame_size = 0xff; 1499 - fm_st_proto.hdr_len = 1; 1500 - fm_st_proto.offset_len_in_hdr = 0; 1501 - fm_st_proto.len_size = 1; 1502 - fm_st_proto.reserve = 1; 1503 - 1504 - ret = st_register(&fm_st_proto); 1505 - if (ret == -EINPROGRESS) { 1506 - init_completion(&wait_for_fmdrv_reg_comp); 1507 - fmdev->streg_cbdata = -EINPROGRESS; 1508 - fmdbg("%s waiting for ST reg completion signal\n", __func__); 1509 - 1510 - if (!wait_for_completion_timeout(&wait_for_fmdrv_reg_comp, 1511 - FM_ST_REG_TIMEOUT)) { 1512 - fmerr("Timeout(%d sec), didn't get reg completion signal from ST\n", 1513 - jiffies_to_msecs(FM_ST_REG_TIMEOUT) / 1000); 1514 - return -ETIMEDOUT; 1515 - } 1516 - if (fmdev->streg_cbdata != 0) { 1517 - fmerr("ST reg comp CB called with error status %d\n", 1518 - fmdev->streg_cbdata); 1519 - return -EAGAIN; 1520 - } 1521 - 1522 - ret = 0; 1523 - } else if (ret < 0) { 1524 - fmerr("st_register failed %d\n", ret); 1525 - return -EAGAIN; 1526 - } 1527 - 1528 - if (fm_st_proto.write != NULL) { 1529 - g_st_write = fm_st_proto.write; 1530 - } else { 1531 - fmerr("Failed to get ST write func pointer\n"); 1532 - ret = st_unregister(&fm_st_proto); 1533 - if (ret < 0) 1534 - fmerr("st_unregister failed %d\n", ret); 1535 - return -EAGAIN; 1536 - } 1537 - 1538 - spin_lock_init(&fmdev->rds_buff_lock); 1539 - spin_lock_init(&fmdev->resp_skb_lock); 1540 - 1541 - /* Initialize TX queue and TX bh work */ 1542 - skb_queue_head_init(&fmdev->tx_q); 1543 - INIT_WORK(&fmdev->tx_bh_work, send_bh_work); 1544 - 1545 - /* Initialize RX Queue and RX bh work */ 1546 - skb_queue_head_init(&fmdev->rx_q); 1547 - INIT_WORK(&fmdev->rx_bh_work, recv_bh_work); 1548 - 1549 - fmdev->irq_info.stage = 0; 1550 - atomic_set(&fmdev->tx_cnt, 1); 1551 - fmdev->resp_comp = NULL; 1552 - 1553 - timer_setup(&fmdev->irq_info.timer, int_timeout_handler, 0); 1554 - /*TODO: add FM_STIC_EVENT later */ 1555 - fmdev->irq_info.mask = FM_MAL_EVENT; 1556 - 1557 - /* Region info */ 1558 - fmdev->rx.region = region_configs[default_radio_region]; 1559 - 1560 - fmdev->rx.mute_mode = FM_MUTE_OFF; 1561 - fmdev->rx.rf_depend_mute = FM_RX_RF_DEPENDENT_MUTE_OFF; 1562 - fmdev->rx.rds.flag = FM_RDS_DISABLE; 1563 - fmdev->rx.freq = FM_UNDEFINED_FREQ; 1564 - fmdev->rx.rds_mode = FM_RDS_SYSTEM_RDS; 1565 - fmdev->rx.af_mode = FM_RX_RDS_AF_SWITCH_MODE_OFF; 1566 - fmdev->irq_info.retry = 0; 1567 - 1568 - fm_rx_reset_rds_cache(fmdev); 1569 - init_waitqueue_head(&fmdev->rx.rds.read_queue); 1570 - 1571 - fm_rx_reset_station_info(fmdev); 1572 - set_bit(FM_CORE_READY, &fmdev->flag); 1573 - 1574 - return ret; 1575 - } 1576 - 1577 - /* 1578 - * This function will be called from FM V4L2 release function. 1579 - * Unregister from ST driver. 1580 - */ 1581 - int fmc_release(struct fmdev *fmdev) 1582 - { 1583 - static struct st_proto_s fm_st_proto; 1584 - int ret; 1585 - 1586 - if (!test_bit(FM_CORE_READY, &fmdev->flag)) { 1587 - fmdbg("FM Core is already down\n"); 1588 - return 0; 1589 - } 1590 - /* Service pending read */ 1591 - wake_up_interruptible(&fmdev->rx.rds.read_queue); 1592 - 1593 - cancel_work_sync(&fmdev->tx_bh_work); 1594 - cancel_work_sync(&fmdev->rx_bh_work); 1595 - 1596 - skb_queue_purge(&fmdev->tx_q); 1597 - skb_queue_purge(&fmdev->rx_q); 1598 - 1599 - fmdev->resp_comp = NULL; 1600 - fmdev->rx.freq = 0; 1601 - 1602 - memset(&fm_st_proto, 0, sizeof(fm_st_proto)); 1603 - fm_st_proto.chnl_id = 0x08; 1604 - 1605 - ret = st_unregister(&fm_st_proto); 1606 - 1607 - if (ret < 0) 1608 - fmerr("Failed to de-register FM from ST %d\n", ret); 1609 - else 1610 - fmdbg("Successfully unregistered from ST\n"); 1611 - 1612 - clear_bit(FM_CORE_READY, &fmdev->flag); 1613 - return ret; 1614 - } 1615 - 1616 - /* 1617 - * Module init function. Ask FM V4L module to register video device. 1618 - * Allocate memory for FM driver context and RX RDS buffer. 1619 - */ 1620 - static int __init fm_drv_init(void) 1621 - { 1622 - struct fmdev *fmdev = NULL; 1623 - int ret = -ENOMEM; 1624 - 1625 - fmdbg("FM driver version %s\n", FM_DRV_VERSION); 1626 - 1627 - fmdev = kzalloc(sizeof(struct fmdev), GFP_KERNEL); 1628 - if (NULL == fmdev) { 1629 - fmerr("Can't allocate operation structure memory\n"); 1630 - return ret; 1631 - } 1632 - fmdev->rx.rds.buf_size = default_rds_buf * FM_RDS_BLK_SIZE; 1633 - fmdev->rx.rds.buff = kzalloc(fmdev->rx.rds.buf_size, GFP_KERNEL); 1634 - if (NULL == fmdev->rx.rds.buff) { 1635 - fmerr("Can't allocate rds ring buffer\n"); 1636 - goto rel_dev; 1637 - } 1638 - 1639 - ret = fm_v4l2_init_video_device(fmdev, radio_nr); 1640 - if (ret < 0) 1641 - goto rel_rdsbuf; 1642 - 1643 - fmdev->irq_info.handlers = int_handler_table; 1644 - fmdev->curr_fmmode = FM_MODE_OFF; 1645 - fmdev->tx_data.pwr_lvl = FM_PWR_LVL_DEF; 1646 - fmdev->tx_data.preemph = FM_TX_PREEMPH_50US; 1647 - return ret; 1648 - 1649 - rel_rdsbuf: 1650 - kfree(fmdev->rx.rds.buff); 1651 - rel_dev: 1652 - kfree(fmdev); 1653 - 1654 - return ret; 1655 - } 1656 - 1657 - /* Module exit function. Ask FM V4L module to unregister video device */ 1658 - static void __exit fm_drv_exit(void) 1659 - { 1660 - struct fmdev *fmdev = NULL; 1661 - 1662 - fmdev = fm_v4l2_deinit_video_device(); 1663 - if (fmdev != NULL) { 1664 - kfree(fmdev->rx.rds.buff); 1665 - kfree(fmdev); 1666 - } 1667 - } 1668 - 1669 - module_init(fm_drv_init); 1670 - module_exit(fm_drv_exit); 1671 - 1672 - /* ------------- Module Info ------------- */ 1673 - MODULE_AUTHOR("Manjunatha Halli <manjunatha_halli@ti.com>"); 1674 - MODULE_DESCRIPTION("FM Driver for TI's Connectivity chip. " FM_DRV_VERSION); 1675 - MODULE_VERSION(FM_DRV_VERSION); 1676 - MODULE_LICENSE("GPL");
-389
drivers/media/radio/wl128x/fmdrv_common.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * FM Common module header file 5 - * 6 - * Copyright (C) 2011 Texas Instruments 7 - */ 8 - 9 - #ifndef _FMDRV_COMMON_H 10 - #define _FMDRV_COMMON_H 11 - 12 - #define FM_ST_REG_TIMEOUT msecs_to_jiffies(6000) /* 6 sec */ 13 - #define FM_PKT_LOGICAL_CHAN_NUMBER 0x08 /* Logical channel 8 */ 14 - 15 - #define REG_RD 0x1 16 - #define REG_WR 0x0 17 - 18 - struct fm_reg_table { 19 - u8 opcode; 20 - u8 type; 21 - u8 *name; 22 - }; 23 - 24 - #define STEREO_GET 0 25 - #define RSSI_LVL_GET 1 26 - #define IF_COUNT_GET 2 27 - #define FLAG_GET 3 28 - #define RDS_SYNC_GET 4 29 - #define RDS_DATA_GET 5 30 - #define FREQ_SET 10 31 - #define AF_FREQ_SET 11 32 - #define MOST_MODE_SET 12 33 - #define MOST_BLEND_SET 13 34 - #define DEMPH_MODE_SET 14 35 - #define SEARCH_LVL_SET 15 36 - #define BAND_SET 16 37 - #define MUTE_STATUS_SET 17 38 - #define RDS_PAUSE_LVL_SET 18 39 - #define RDS_PAUSE_DUR_SET 19 40 - #define RDS_MEM_SET 20 41 - #define RDS_BLK_B_SET 21 42 - #define RDS_MSK_B_SET 22 43 - #define RDS_PI_MASK_SET 23 44 - #define RDS_PI_SET 24 45 - #define RDS_SYSTEM_SET 25 46 - #define INT_MASK_SET 26 47 - #define SEARCH_DIR_SET 27 48 - #define VOLUME_SET 28 49 - #define AUDIO_ENABLE_SET 29 50 - #define PCM_MODE_SET 30 51 - #define I2S_MODE_CONFIG_SET 31 52 - #define POWER_SET 32 53 - #define INTX_CONFIG_SET 33 54 - #define PULL_EN_SET 34 55 - #define HILO_SET 35 56 - #define SWITCH2FREF 36 57 - #define FREQ_DRIFT_REPORT 37 58 - 59 - #define PCE_GET 40 60 - #define FIRM_VER_GET 41 61 - #define ASIC_VER_GET 42 62 - #define ASIC_ID_GET 43 63 - #define MAN_ID_GET 44 64 - #define TUNER_MODE_SET 45 65 - #define STOP_SEARCH 46 66 - #define RDS_CNTRL_SET 47 67 - 68 - #define WRITE_HARDWARE_REG 100 69 - #define CODE_DOWNLOAD 101 70 - #define RESET 102 71 - 72 - #define FM_POWER_MODE 254 73 - #define FM_INTERRUPT 255 74 - 75 - /* Transmitter API */ 76 - 77 - #define CHANL_SET 55 78 - #define CHANL_BW_SET 56 79 - #define REF_SET 57 80 - #define POWER_ENB_SET 90 81 - #define POWER_ATT_SET 58 82 - #define POWER_LEV_SET 59 83 - #define AUDIO_DEV_SET 60 84 - #define PILOT_DEV_SET 61 85 - #define RDS_DEV_SET 62 86 - #define TX_BAND_SET 65 87 - #define PUPD_SET 91 88 - #define AUDIO_IO_SET 63 89 - #define PREMPH_SET 64 90 - #define MONO_SET 66 91 - #define MUTE 92 92 - #define MPX_LMT_ENABLE 67 93 - #define PI_SET 93 94 - #define ECC_SET 69 95 - #define PTY 70 96 - #define AF 71 97 - #define DISPLAY_MODE 74 98 - #define RDS_REP_SET 77 99 - #define RDS_CONFIG_DATA_SET 98 100 - #define RDS_DATA_SET 99 101 - #define RDS_DATA_ENB 94 102 - #define TA_SET 78 103 - #define TP_SET 79 104 - #define DI_SET 80 105 - #define MS_SET 81 106 - #define PS_SCROLL_SPEED 82 107 - #define TX_AUDIO_LEVEL_TEST 96 108 - #define TX_AUDIO_LEVEL_TEST_THRESHOLD 73 109 - #define TX_AUDIO_INPUT_LEVEL_RANGE_SET 54 110 - #define RX_ANTENNA_SELECT 87 111 - #define I2C_DEV_ADDR_SET 86 112 - #define REF_ERR_CALIB_PARAM_SET 88 113 - #define REF_ERR_CALIB_PERIODICITY_SET 89 114 - #define SOC_INT_TRIGGER 52 115 - #define SOC_AUDIO_PATH_SET 83 116 - #define SOC_PCMI_OVERRIDE 84 117 - #define SOC_I2S_OVERRIDE 85 118 - #define RSSI_BLOCK_SCAN_FREQ_SET 95 119 - #define RSSI_BLOCK_SCAN_START 97 120 - #define RSSI_BLOCK_SCAN_DATA_GET 5 121 - #define READ_FMANT_TUNE_VALUE 104 122 - 123 - /* SKB helpers */ 124 - struct fm_skb_cb { 125 - __u8 fm_op; 126 - struct completion *completion; 127 - }; 128 - 129 - #define fm_cb(skb) ((struct fm_skb_cb *)(skb->cb)) 130 - 131 - /* FM Channel-8 command message format */ 132 - struct fm_cmd_msg_hdr { 133 - __u8 hdr; /* Logical Channel-8 */ 134 - __u8 len; /* Number of bytes follows */ 135 - __u8 op; /* FM Opcode */ 136 - __u8 rd_wr; /* Read/Write command */ 137 - __u8 dlen; /* Length of payload */ 138 - } __attribute__ ((packed)); 139 - 140 - #define FM_CMD_MSG_HDR_SIZE 5 /* sizeof(struct fm_cmd_msg_hdr) */ 141 - 142 - /* FM Channel-8 event messgage format */ 143 - struct fm_event_msg_hdr { 144 - __u8 header; /* Logical Channel-8 */ 145 - __u8 len; /* Number of bytes follows */ 146 - __u8 status; /* Event status */ 147 - __u8 num_fm_hci_cmds; /* Number of pkts the host allowed to send */ 148 - __u8 op; /* FM Opcode */ 149 - __u8 rd_wr; /* Read/Write command */ 150 - __u8 dlen; /* Length of payload */ 151 - } __attribute__ ((packed)); 152 - 153 - #define FM_EVT_MSG_HDR_SIZE 7 /* sizeof(struct fm_event_msg_hdr) */ 154 - 155 - /* TI's magic number in firmware file */ 156 - #define FM_FW_FILE_HEADER_MAGIC 0x42535442 157 - 158 - #define FM_ENABLE 1 159 - #define FM_DISABLE 0 160 - 161 - /* FLAG_GET register bits */ 162 - #define FM_FR_EVENT BIT(0) 163 - #define FM_BL_EVENT BIT(1) 164 - #define FM_RDS_EVENT BIT(2) 165 - #define FM_BBLK_EVENT BIT(3) 166 - #define FM_LSYNC_EVENT BIT(4) 167 - #define FM_LEV_EVENT BIT(5) 168 - #define FM_IFFR_EVENT BIT(6) 169 - #define FM_PI_EVENT BIT(7) 170 - #define FM_PD_EVENT BIT(8) 171 - #define FM_STIC_EVENT BIT(9) 172 - #define FM_MAL_EVENT BIT(10) 173 - #define FM_POW_ENB_EVENT BIT(11) 174 - 175 - /* 176 - * Firmware files of FM. ASIC ID and ASIC version will be appened to this, 177 - * later. 178 - */ 179 - #define FM_FMC_FW_FILE_START ("fmc_ch8") 180 - #define FM_RX_FW_FILE_START ("fm_rx_ch8") 181 - #define FM_TX_FW_FILE_START ("fm_tx_ch8") 182 - 183 - #define FM_UNDEFINED_FREQ 0xFFFFFFFF 184 - 185 - /* Band types */ 186 - #define FM_BAND_EUROPE_US 0 187 - #define FM_BAND_JAPAN 1 188 - 189 - /* Seek directions */ 190 - #define FM_SEARCH_DIRECTION_DOWN 0 191 - #define FM_SEARCH_DIRECTION_UP 1 192 - 193 - /* Tunner modes */ 194 - #define FM_TUNER_STOP_SEARCH_MODE 0 195 - #define FM_TUNER_PRESET_MODE 1 196 - #define FM_TUNER_AUTONOMOUS_SEARCH_MODE 2 197 - #define FM_TUNER_AF_JUMP_MODE 3 198 - 199 - /* Min and Max volume */ 200 - #define FM_RX_VOLUME_MIN 0 201 - #define FM_RX_VOLUME_MAX 70 202 - 203 - /* Volume gain step */ 204 - #define FM_RX_VOLUME_GAIN_STEP 0x370 205 - 206 - /* Mute modes */ 207 - #define FM_MUTE_ON 0 208 - #define FM_MUTE_OFF 1 209 - #define FM_MUTE_ATTENUATE 2 210 - 211 - #define FM_RX_UNMUTE_MODE 0x00 212 - #define FM_RX_RF_DEP_MODE 0x01 213 - #define FM_RX_AC_MUTE_MODE 0x02 214 - #define FM_RX_HARD_MUTE_LEFT_MODE 0x04 215 - #define FM_RX_HARD_MUTE_RIGHT_MODE 0x08 216 - #define FM_RX_SOFT_MUTE_FORCE_MODE 0x10 217 - 218 - /* RF dependent mute mode */ 219 - #define FM_RX_RF_DEPENDENT_MUTE_ON 1 220 - #define FM_RX_RF_DEPENDENT_MUTE_OFF 0 221 - 222 - /* RSSI threshold min and max */ 223 - #define FM_RX_RSSI_THRESHOLD_MIN -128 224 - #define FM_RX_RSSI_THRESHOLD_MAX 127 225 - 226 - /* Stereo/Mono mode */ 227 - #define FM_STEREO_MODE 0 228 - #define FM_MONO_MODE 1 229 - #define FM_STEREO_SOFT_BLEND 1 230 - 231 - /* FM RX De-emphasis filter modes */ 232 - #define FM_RX_EMPHASIS_FILTER_50_USEC 0 233 - #define FM_RX_EMPHASIS_FILTER_75_USEC 1 234 - 235 - /* FM RDS modes */ 236 - #define FM_RDS_DISABLE 0 237 - #define FM_RDS_ENABLE 1 238 - 239 - #define FM_NO_PI_CODE 0 240 - 241 - /* FM and RX RDS block enable/disable */ 242 - #define FM_RX_PWR_SET_FM_ON_RDS_OFF 0x1 243 - #define FM_RX_PWR_SET_FM_AND_RDS_BLK_ON 0x3 244 - #define FM_RX_PWR_SET_FM_AND_RDS_BLK_OFF 0x0 245 - 246 - /* RX RDS */ 247 - #define FM_RX_RDS_FLUSH_FIFO 0x1 248 - #define FM_RX_RDS_FIFO_THRESHOLD 64 /* tuples */ 249 - #define FM_RDS_BLK_SIZE 3 /* 3 bytes */ 250 - 251 - /* RDS block types */ 252 - #define FM_RDS_BLOCK_A 0 253 - #define FM_RDS_BLOCK_B 1 254 - #define FM_RDS_BLOCK_C 2 255 - #define FM_RDS_BLOCK_Ctag 3 256 - #define FM_RDS_BLOCK_D 4 257 - #define FM_RDS_BLOCK_E 5 258 - 259 - #define FM_RDS_BLK_IDX_A 0 260 - #define FM_RDS_BLK_IDX_B 1 261 - #define FM_RDS_BLK_IDX_C 2 262 - #define FM_RDS_BLK_IDX_D 3 263 - #define FM_RDS_BLK_IDX_UNKNOWN 0xF0 264 - 265 - #define FM_RDS_STATUS_ERR_MASK 0x18 266 - 267 - /* 268 - * Represents an RDS group type & version. 269 - * There are 15 groups, each group has 2 versions: A and B. 270 - */ 271 - #define FM_RDS_GROUP_TYPE_MASK_0A BIT(0) 272 - #define FM_RDS_GROUP_TYPE_MASK_0B BIT(1) 273 - #define FM_RDS_GROUP_TYPE_MASK_1A BIT(2) 274 - #define FM_RDS_GROUP_TYPE_MASK_1B BIT(3) 275 - #define FM_RDS_GROUP_TYPE_MASK_2A BIT(4) 276 - #define FM_RDS_GROUP_TYPE_MASK_2B BIT(5) 277 - #define FM_RDS_GROUP_TYPE_MASK_3A BIT(6) 278 - #define FM_RDS_GROUP_TYPE_MASK_3B BIT(7) 279 - #define FM_RDS_GROUP_TYPE_MASK_4A BIT(8) 280 - #define FM_RDS_GROUP_TYPE_MASK_4B BIT(9) 281 - #define FM_RDS_GROUP_TYPE_MASK_5A BIT(10) 282 - #define FM_RDS_GROUP_TYPE_MASK_5B BIT(11) 283 - #define FM_RDS_GROUP_TYPE_MASK_6A BIT(12) 284 - #define FM_RDS_GROUP_TYPE_MASK_6B BIT(13) 285 - #define FM_RDS_GROUP_TYPE_MASK_7A BIT(14) 286 - #define FM_RDS_GROUP_TYPE_MASK_7B BIT(15) 287 - #define FM_RDS_GROUP_TYPE_MASK_8A BIT(16) 288 - #define FM_RDS_GROUP_TYPE_MASK_8B BIT(17) 289 - #define FM_RDS_GROUP_TYPE_MASK_9A BIT(18) 290 - #define FM_RDS_GROUP_TYPE_MASK_9B BIT(19) 291 - #define FM_RDS_GROUP_TYPE_MASK_10A BIT(20) 292 - #define FM_RDS_GROUP_TYPE_MASK_10B BIT(21) 293 - #define FM_RDS_GROUP_TYPE_MASK_11A BIT(22) 294 - #define FM_RDS_GROUP_TYPE_MASK_11B BIT(23) 295 - #define FM_RDS_GROUP_TYPE_MASK_12A BIT(24) 296 - #define FM_RDS_GROUP_TYPE_MASK_12B BIT(25) 297 - #define FM_RDS_GROUP_TYPE_MASK_13A BIT(26) 298 - #define FM_RDS_GROUP_TYPE_MASK_13B BIT(27) 299 - #define FM_RDS_GROUP_TYPE_MASK_14A BIT(28) 300 - #define FM_RDS_GROUP_TYPE_MASK_14B BIT(29) 301 - #define FM_RDS_GROUP_TYPE_MASK_15A BIT(30) 302 - #define FM_RDS_GROUP_TYPE_MASK_15B BIT(31) 303 - 304 - /* RX Alternate Frequency info */ 305 - #define FM_RDS_MIN_AF 1 306 - #define FM_RDS_MAX_AF 204 307 - #define FM_RDS_MAX_AF_JAPAN 140 308 - #define FM_RDS_1_AF_FOLLOWS 225 309 - #define FM_RDS_25_AF_FOLLOWS 249 310 - 311 - /* RDS system type (RDS/RBDS) */ 312 - #define FM_RDS_SYSTEM_RDS 0 313 - #define FM_RDS_SYSTEM_RBDS 1 314 - 315 - /* AF on/off */ 316 - #define FM_RX_RDS_AF_SWITCH_MODE_ON 1 317 - #define FM_RX_RDS_AF_SWITCH_MODE_OFF 0 318 - 319 - /* Retry count when interrupt process goes wrong */ 320 - #define FM_IRQ_TIMEOUT_RETRY_MAX 5 /* 5 times */ 321 - 322 - /* Audio IO set values */ 323 - #define FM_RX_AUDIO_ENABLE_I2S 0x01 324 - #define FM_RX_AUDIO_ENABLE_ANALOG 0x02 325 - #define FM_RX_AUDIO_ENABLE_I2S_AND_ANALOG 0x03 326 - #define FM_RX_AUDIO_ENABLE_DISABLE 0x00 327 - 328 - /* HI/LO set values */ 329 - #define FM_RX_IFFREQ_TO_HI_SIDE 0x0 330 - #define FM_RX_IFFREQ_TO_LO_SIDE 0x1 331 - #define FM_RX_IFFREQ_HILO_AUTOMATIC 0x2 332 - 333 - /* 334 - * Default RX mode configuration. Chip will be configured 335 - * with this default values after loading RX firmware. 336 - */ 337 - #define FM_DEFAULT_RX_VOLUME 10 338 - #define FM_DEFAULT_RSSI_THRESHOLD 3 339 - 340 - /* Range for TX power level in units for dB/uV */ 341 - #define FM_PWR_LVL_LOW 91 342 - #define FM_PWR_LVL_HIGH 122 343 - 344 - /* Chip specific default TX power level value */ 345 - #define FM_PWR_LVL_DEF 4 346 - 347 - /* FM TX Pre-emphasis filter values */ 348 - #define FM_TX_PREEMPH_OFF 1 349 - #define FM_TX_PREEMPH_50US 0 350 - #define FM_TX_PREEMPH_75US 2 351 - 352 - /* FM TX antenna impedance values */ 353 - #define FM_TX_ANT_IMP_50 0 354 - #define FM_TX_ANT_IMP_200 1 355 - #define FM_TX_ANT_IMP_500 2 356 - 357 - /* Functions exported by FM common sub-module */ 358 - int fmc_prepare(struct fmdev *); 359 - int fmc_release(struct fmdev *); 360 - 361 - void fmc_update_region_info(struct fmdev *, u8); 362 - int fmc_send_cmd(struct fmdev *, u8, u16, 363 - void *, unsigned int, void *, int *); 364 - int fmc_is_rds_data_available(struct fmdev *, struct file *, 365 - struct poll_table_struct *); 366 - int fmc_transfer_rds_from_internal_buff(struct fmdev *, struct file *, 367 - u8 __user *, size_t); 368 - 369 - int fmc_set_freq(struct fmdev *, u32); 370 - int fmc_set_mode(struct fmdev *, u8); 371 - int fmc_set_region(struct fmdev *, u8); 372 - int fmc_set_mute_mode(struct fmdev *, u8); 373 - int fmc_set_stereo_mono(struct fmdev *, u16); 374 - int fmc_set_rds_mode(struct fmdev *, u8); 375 - 376 - int fmc_get_freq(struct fmdev *, u32 *); 377 - int fmc_get_region(struct fmdev *, u8 *); 378 - int fmc_get_mode(struct fmdev *, u8 *); 379 - 380 - /* 381 - * channel spacing 382 - */ 383 - #define FM_CHANNEL_SPACING_50KHZ 1 384 - #define FM_CHANNEL_SPACING_100KHZ 2 385 - #define FM_CHANNEL_SPACING_200KHZ 4 386 - #define FM_FREQ_MUL 50 387 - 388 - #endif 389 -
-820
drivers/media/radio/wl128x/fmdrv_rx.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * This sub-module of FM driver implements FM RX functionality. 5 - * 6 - * Copyright (C) 2011 Texas Instruments 7 - * Author: Raja Mani <raja_mani@ti.com> 8 - * Author: Manjunatha Halli <manjunatha_halli@ti.com> 9 - */ 10 - 11 - #include "fmdrv.h" 12 - #include "fmdrv_common.h" 13 - #include "fmdrv_rx.h" 14 - 15 - void fm_rx_reset_rds_cache(struct fmdev *fmdev) 16 - { 17 - fmdev->rx.rds.flag = FM_RDS_DISABLE; 18 - fmdev->rx.rds.last_blk_idx = 0; 19 - fmdev->rx.rds.wr_idx = 0; 20 - fmdev->rx.rds.rd_idx = 0; 21 - 22 - if (fmdev->rx.af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) 23 - fmdev->irq_info.mask |= FM_LEV_EVENT; 24 - } 25 - 26 - void fm_rx_reset_station_info(struct fmdev *fmdev) 27 - { 28 - fmdev->rx.stat_info.picode = FM_NO_PI_CODE; 29 - fmdev->rx.stat_info.afcache_size = 0; 30 - fmdev->rx.stat_info.af_list_max = 0; 31 - } 32 - 33 - int fm_rx_set_freq(struct fmdev *fmdev, u32 freq) 34 - { 35 - unsigned long timeleft; 36 - u16 payload, curr_frq, intr_flag; 37 - u32 curr_frq_in_khz; 38 - u32 resp_len; 39 - int ret; 40 - 41 - if (freq < fmdev->rx.region.bot_freq || freq > fmdev->rx.region.top_freq) { 42 - fmerr("Invalid frequency %d\n", freq); 43 - return -EINVAL; 44 - } 45 - 46 - /* Set audio enable */ 47 - payload = FM_RX_AUDIO_ENABLE_I2S_AND_ANALOG; 48 - 49 - ret = fmc_send_cmd(fmdev, AUDIO_ENABLE_SET, REG_WR, &payload, 50 - sizeof(payload), NULL, NULL); 51 - if (ret < 0) 52 - return ret; 53 - 54 - /* Set hilo to automatic selection */ 55 - payload = FM_RX_IFFREQ_HILO_AUTOMATIC; 56 - ret = fmc_send_cmd(fmdev, HILO_SET, REG_WR, &payload, 57 - sizeof(payload), NULL, NULL); 58 - if (ret < 0) 59 - return ret; 60 - 61 - /* Calculate frequency index and set*/ 62 - payload = (freq - fmdev->rx.region.bot_freq) / FM_FREQ_MUL; 63 - 64 - ret = fmc_send_cmd(fmdev, FREQ_SET, REG_WR, &payload, 65 - sizeof(payload), NULL, NULL); 66 - if (ret < 0) 67 - return ret; 68 - 69 - /* Read flags - just to clear any pending interrupts if we had */ 70 - ret = fmc_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, 2, NULL, NULL); 71 - if (ret < 0) 72 - return ret; 73 - 74 - /* Enable FR, BL interrupts */ 75 - intr_flag = fmdev->irq_info.mask; 76 - fmdev->irq_info.mask = (FM_FR_EVENT | FM_BL_EVENT); 77 - payload = fmdev->irq_info.mask; 78 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 79 - sizeof(payload), NULL, NULL); 80 - if (ret < 0) 81 - return ret; 82 - 83 - /* Start tune */ 84 - payload = FM_TUNER_PRESET_MODE; 85 - ret = fmc_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload, 86 - sizeof(payload), NULL, NULL); 87 - if (ret < 0) 88 - goto exit; 89 - 90 - /* Wait for tune ended interrupt */ 91 - init_completion(&fmdev->maintask_comp); 92 - timeleft = wait_for_completion_timeout(&fmdev->maintask_comp, 93 - FM_DRV_TX_TIMEOUT); 94 - if (!timeleft) { 95 - fmerr("Timeout(%d sec),didn't get tune ended int\n", 96 - jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); 97 - ret = -ETIMEDOUT; 98 - goto exit; 99 - } 100 - 101 - /* Read freq back to confirm */ 102 - ret = fmc_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, 2, &curr_frq, &resp_len); 103 - if (ret < 0) 104 - goto exit; 105 - 106 - curr_frq = be16_to_cpu((__force __be16)curr_frq); 107 - curr_frq_in_khz = (fmdev->rx.region.bot_freq + ((u32)curr_frq * FM_FREQ_MUL)); 108 - 109 - if (curr_frq_in_khz != freq) { 110 - pr_info("Frequency is set to (%d) but requested freq is (%d)\n", 111 - curr_frq_in_khz, freq); 112 - } 113 - 114 - /* Update local cache */ 115 - fmdev->rx.freq = curr_frq_in_khz; 116 - exit: 117 - /* Re-enable default FM interrupts */ 118 - fmdev->irq_info.mask = intr_flag; 119 - payload = fmdev->irq_info.mask; 120 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 121 - sizeof(payload), NULL, NULL); 122 - if (ret < 0) 123 - return ret; 124 - 125 - /* Reset RDS cache and current station pointers */ 126 - fm_rx_reset_rds_cache(fmdev); 127 - fm_rx_reset_station_info(fmdev); 128 - 129 - return ret; 130 - } 131 - 132 - static int fm_rx_set_channel_spacing(struct fmdev *fmdev, u32 spacing) 133 - { 134 - u16 payload; 135 - int ret; 136 - 137 - if (spacing > 0 && spacing <= 50000) 138 - spacing = FM_CHANNEL_SPACING_50KHZ; 139 - else if (spacing > 50000 && spacing <= 100000) 140 - spacing = FM_CHANNEL_SPACING_100KHZ; 141 - else 142 - spacing = FM_CHANNEL_SPACING_200KHZ; 143 - 144 - /* set channel spacing */ 145 - payload = spacing; 146 - ret = fmc_send_cmd(fmdev, CHANL_BW_SET, REG_WR, &payload, 147 - sizeof(payload), NULL, NULL); 148 - if (ret < 0) 149 - return ret; 150 - 151 - fmdev->rx.region.chanl_space = spacing * FM_FREQ_MUL; 152 - 153 - return ret; 154 - } 155 - 156 - int fm_rx_seek(struct fmdev *fmdev, u32 seek_upward, 157 - u32 wrap_around, u32 spacing) 158 - { 159 - u32 resp_len; 160 - u16 curr_frq, next_frq, last_frq; 161 - u16 payload, int_reason, intr_flag; 162 - u16 offset, space_idx; 163 - unsigned long timeleft; 164 - int ret; 165 - 166 - /* Set channel spacing */ 167 - ret = fm_rx_set_channel_spacing(fmdev, spacing); 168 - if (ret < 0) { 169 - fmerr("Failed to set channel spacing\n"); 170 - return ret; 171 - } 172 - 173 - /* Read the current frequency from chip */ 174 - ret = fmc_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, 175 - sizeof(curr_frq), &curr_frq, &resp_len); 176 - if (ret < 0) 177 - return ret; 178 - 179 - curr_frq = be16_to_cpu((__force __be16)curr_frq); 180 - last_frq = (fmdev->rx.region.top_freq - fmdev->rx.region.bot_freq) / FM_FREQ_MUL; 181 - 182 - /* Check the offset in order to be aligned to the channel spacing*/ 183 - space_idx = fmdev->rx.region.chanl_space / FM_FREQ_MUL; 184 - offset = curr_frq % space_idx; 185 - 186 - next_frq = seek_upward ? curr_frq + space_idx /* Seek Up */ : 187 - curr_frq - space_idx /* Seek Down */ ; 188 - 189 - /* 190 - * Add or subtract offset in order to stay aligned to the channel 191 - * spacing. 192 - */ 193 - if ((short)next_frq < 0) 194 - next_frq = last_frq - offset; 195 - else if (next_frq > last_frq) 196 - next_frq = 0 + offset; 197 - 198 - again: 199 - /* Set calculated next frequency to perform seek */ 200 - payload = next_frq; 201 - ret = fmc_send_cmd(fmdev, FREQ_SET, REG_WR, &payload, 202 - sizeof(payload), NULL, NULL); 203 - if (ret < 0) 204 - return ret; 205 - 206 - /* Set search direction (0:Seek Down, 1:Seek Up) */ 207 - payload = (seek_upward ? FM_SEARCH_DIRECTION_UP : FM_SEARCH_DIRECTION_DOWN); 208 - ret = fmc_send_cmd(fmdev, SEARCH_DIR_SET, REG_WR, &payload, 209 - sizeof(payload), NULL, NULL); 210 - if (ret < 0) 211 - return ret; 212 - 213 - /* Read flags - just to clear any pending interrupts if we had */ 214 - ret = fmc_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, 2, NULL, NULL); 215 - if (ret < 0) 216 - return ret; 217 - 218 - /* Enable FR, BL interrupts */ 219 - intr_flag = fmdev->irq_info.mask; 220 - fmdev->irq_info.mask = (FM_FR_EVENT | FM_BL_EVENT); 221 - payload = fmdev->irq_info.mask; 222 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 223 - sizeof(payload), NULL, NULL); 224 - if (ret < 0) 225 - return ret; 226 - 227 - /* Start seek */ 228 - payload = FM_TUNER_AUTONOMOUS_SEARCH_MODE; 229 - ret = fmc_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload, 230 - sizeof(payload), NULL, NULL); 231 - if (ret < 0) 232 - return ret; 233 - 234 - /* Wait for tune ended/band limit reached interrupt */ 235 - init_completion(&fmdev->maintask_comp); 236 - timeleft = wait_for_completion_timeout(&fmdev->maintask_comp, 237 - FM_DRV_RX_SEEK_TIMEOUT); 238 - if (!timeleft) { 239 - fmerr("Timeout(%d sec),didn't get tune ended int\n", 240 - jiffies_to_msecs(FM_DRV_RX_SEEK_TIMEOUT) / 1000); 241 - return -ENODATA; 242 - } 243 - 244 - int_reason = fmdev->irq_info.flag & (FM_TUNE_COMPLETE | FM_BAND_LIMIT); 245 - 246 - /* Re-enable default FM interrupts */ 247 - fmdev->irq_info.mask = intr_flag; 248 - payload = fmdev->irq_info.mask; 249 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 250 - sizeof(payload), NULL, NULL); 251 - if (ret < 0) 252 - return ret; 253 - 254 - if (int_reason & FM_BL_EVENT) { 255 - if (wrap_around == 0) { 256 - fmdev->rx.freq = seek_upward ? 257 - fmdev->rx.region.top_freq : 258 - fmdev->rx.region.bot_freq; 259 - } else { 260 - fmdev->rx.freq = seek_upward ? 261 - fmdev->rx.region.bot_freq : 262 - fmdev->rx.region.top_freq; 263 - /* Calculate frequency index to write */ 264 - next_frq = (fmdev->rx.freq - 265 - fmdev->rx.region.bot_freq) / FM_FREQ_MUL; 266 - goto again; 267 - } 268 - } else { 269 - /* Read freq to know where operation tune operation stopped */ 270 - ret = fmc_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, 2, 271 - &curr_frq, &resp_len); 272 - if (ret < 0) 273 - return ret; 274 - 275 - curr_frq = be16_to_cpu((__force __be16)curr_frq); 276 - fmdev->rx.freq = (fmdev->rx.region.bot_freq + 277 - ((u32)curr_frq * FM_FREQ_MUL)); 278 - 279 - } 280 - /* Reset RDS cache and current station pointers */ 281 - fm_rx_reset_rds_cache(fmdev); 282 - fm_rx_reset_station_info(fmdev); 283 - 284 - return ret; 285 - } 286 - 287 - int fm_rx_set_volume(struct fmdev *fmdev, u16 vol_to_set) 288 - { 289 - u16 payload; 290 - int ret; 291 - 292 - if (fmdev->curr_fmmode != FM_MODE_RX) 293 - return -EPERM; 294 - 295 - if (vol_to_set > FM_RX_VOLUME_MAX) { 296 - fmerr("Volume is not within(%d-%d) range\n", 297 - FM_RX_VOLUME_MIN, FM_RX_VOLUME_MAX); 298 - return -EINVAL; 299 - } 300 - vol_to_set *= FM_RX_VOLUME_GAIN_STEP; 301 - 302 - payload = vol_to_set; 303 - ret = fmc_send_cmd(fmdev, VOLUME_SET, REG_WR, &payload, 304 - sizeof(payload), NULL, NULL); 305 - if (ret < 0) 306 - return ret; 307 - 308 - fmdev->rx.volume = vol_to_set; 309 - return ret; 310 - } 311 - 312 - /* Get volume */ 313 - int fm_rx_get_volume(struct fmdev *fmdev, u16 *curr_vol) 314 - { 315 - if (fmdev->curr_fmmode != FM_MODE_RX) 316 - return -EPERM; 317 - 318 - if (curr_vol == NULL) { 319 - fmerr("Invalid memory\n"); 320 - return -ENOMEM; 321 - } 322 - 323 - *curr_vol = fmdev->rx.volume / FM_RX_VOLUME_GAIN_STEP; 324 - 325 - return 0; 326 - } 327 - 328 - /* To get current band's bottom and top frequency */ 329 - int fm_rx_get_band_freq_range(struct fmdev *fmdev, u32 *bot_freq, u32 *top_freq) 330 - { 331 - if (bot_freq != NULL) 332 - *bot_freq = fmdev->rx.region.bot_freq; 333 - 334 - if (top_freq != NULL) 335 - *top_freq = fmdev->rx.region.top_freq; 336 - 337 - return 0; 338 - } 339 - 340 - /* Returns current band index (0-Europe/US; 1-Japan) */ 341 - void fm_rx_get_region(struct fmdev *fmdev, u8 *region) 342 - { 343 - *region = fmdev->rx.region.fm_band; 344 - } 345 - 346 - /* Sets band (0-Europe/US; 1-Japan) */ 347 - int fm_rx_set_region(struct fmdev *fmdev, u8 region_to_set) 348 - { 349 - u16 payload; 350 - u32 new_frq = 0; 351 - int ret; 352 - 353 - if (region_to_set != FM_BAND_EUROPE_US && 354 - region_to_set != FM_BAND_JAPAN) { 355 - fmerr("Invalid band\n"); 356 - return -EINVAL; 357 - } 358 - 359 - if (fmdev->rx.region.fm_band == region_to_set) { 360 - fmerr("Requested band is already configured\n"); 361 - return 0; 362 - } 363 - 364 - /* Send cmd to set the band */ 365 - payload = (u16)region_to_set; 366 - ret = fmc_send_cmd(fmdev, BAND_SET, REG_WR, &payload, 367 - sizeof(payload), NULL, NULL); 368 - if (ret < 0) 369 - return ret; 370 - 371 - fmc_update_region_info(fmdev, region_to_set); 372 - 373 - /* Check whether current RX frequency is within band boundary */ 374 - if (fmdev->rx.freq < fmdev->rx.region.bot_freq) 375 - new_frq = fmdev->rx.region.bot_freq; 376 - else if (fmdev->rx.freq > fmdev->rx.region.top_freq) 377 - new_frq = fmdev->rx.region.top_freq; 378 - 379 - if (new_frq) { 380 - fmdbg("Current freq is not within band limit boundary,switching to %d KHz\n", 381 - new_frq); 382 - /* Current RX frequency is not in range. So, update it */ 383 - ret = fm_rx_set_freq(fmdev, new_frq); 384 - } 385 - 386 - return ret; 387 - } 388 - 389 - /* Reads current mute mode (Mute Off/On/Attenuate)*/ 390 - int fm_rx_get_mute_mode(struct fmdev *fmdev, u8 *curr_mute_mode) 391 - { 392 - if (fmdev->curr_fmmode != FM_MODE_RX) 393 - return -EPERM; 394 - 395 - if (curr_mute_mode == NULL) { 396 - fmerr("Invalid memory\n"); 397 - return -ENOMEM; 398 - } 399 - 400 - *curr_mute_mode = fmdev->rx.mute_mode; 401 - 402 - return 0; 403 - } 404 - 405 - static int fm_config_rx_mute_reg(struct fmdev *fmdev) 406 - { 407 - u16 payload, muteval; 408 - int ret; 409 - 410 - muteval = 0; 411 - switch (fmdev->rx.mute_mode) { 412 - case FM_MUTE_ON: 413 - muteval = FM_RX_AC_MUTE_MODE; 414 - break; 415 - 416 - case FM_MUTE_OFF: 417 - muteval = FM_RX_UNMUTE_MODE; 418 - break; 419 - 420 - case FM_MUTE_ATTENUATE: 421 - muteval = FM_RX_SOFT_MUTE_FORCE_MODE; 422 - break; 423 - } 424 - if (fmdev->rx.rf_depend_mute == FM_RX_RF_DEPENDENT_MUTE_ON) 425 - muteval |= FM_RX_RF_DEP_MODE; 426 - else 427 - muteval &= ~FM_RX_RF_DEP_MODE; 428 - 429 - payload = muteval; 430 - ret = fmc_send_cmd(fmdev, MUTE_STATUS_SET, REG_WR, &payload, 431 - sizeof(payload), NULL, NULL); 432 - if (ret < 0) 433 - return ret; 434 - 435 - return 0; 436 - } 437 - 438 - /* Configures mute mode (Mute Off/On/Attenuate) */ 439 - int fm_rx_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset) 440 - { 441 - u8 org_state; 442 - int ret; 443 - 444 - if (fmdev->rx.mute_mode == mute_mode_toset) 445 - return 0; 446 - 447 - org_state = fmdev->rx.mute_mode; 448 - fmdev->rx.mute_mode = mute_mode_toset; 449 - 450 - ret = fm_config_rx_mute_reg(fmdev); 451 - if (ret < 0) { 452 - fmdev->rx.mute_mode = org_state; 453 - return ret; 454 - } 455 - 456 - return 0; 457 - } 458 - 459 - /* Gets RF dependent soft mute mode enable/disable status */ 460 - int fm_rx_get_rfdepend_softmute(struct fmdev *fmdev, u8 *curr_mute_mode) 461 - { 462 - if (fmdev->curr_fmmode != FM_MODE_RX) 463 - return -EPERM; 464 - 465 - if (curr_mute_mode == NULL) { 466 - fmerr("Invalid memory\n"); 467 - return -ENOMEM; 468 - } 469 - 470 - *curr_mute_mode = fmdev->rx.rf_depend_mute; 471 - 472 - return 0; 473 - } 474 - 475 - /* Sets RF dependent soft mute mode */ 476 - int fm_rx_set_rfdepend_softmute(struct fmdev *fmdev, u8 rfdepend_mute) 477 - { 478 - u8 org_state; 479 - int ret; 480 - 481 - if (fmdev->curr_fmmode != FM_MODE_RX) 482 - return -EPERM; 483 - 484 - if (rfdepend_mute != FM_RX_RF_DEPENDENT_MUTE_ON && 485 - rfdepend_mute != FM_RX_RF_DEPENDENT_MUTE_OFF) { 486 - fmerr("Invalid RF dependent soft mute\n"); 487 - return -EINVAL; 488 - } 489 - if (fmdev->rx.rf_depend_mute == rfdepend_mute) 490 - return 0; 491 - 492 - org_state = fmdev->rx.rf_depend_mute; 493 - fmdev->rx.rf_depend_mute = rfdepend_mute; 494 - 495 - ret = fm_config_rx_mute_reg(fmdev); 496 - if (ret < 0) { 497 - fmdev->rx.rf_depend_mute = org_state; 498 - return ret; 499 - } 500 - 501 - return 0; 502 - } 503 - 504 - /* Returns the signal strength level of current channel */ 505 - int fm_rx_get_rssi_level(struct fmdev *fmdev, u16 *rssilvl) 506 - { 507 - __be16 curr_rssi_lel; 508 - u32 resp_len; 509 - int ret; 510 - 511 - if (rssilvl == NULL) { 512 - fmerr("Invalid memory\n"); 513 - return -ENOMEM; 514 - } 515 - /* Read current RSSI level */ 516 - ret = fmc_send_cmd(fmdev, RSSI_LVL_GET, REG_RD, NULL, 2, 517 - &curr_rssi_lel, &resp_len); 518 - if (ret < 0) 519 - return ret; 520 - 521 - *rssilvl = be16_to_cpu(curr_rssi_lel); 522 - 523 - return 0; 524 - } 525 - 526 - /* 527 - * Sets the signal strength level that once reached 528 - * will stop the auto search process 529 - */ 530 - int fm_rx_set_rssi_threshold(struct fmdev *fmdev, short rssi_lvl_toset) 531 - { 532 - u16 payload; 533 - int ret; 534 - 535 - if (rssi_lvl_toset < FM_RX_RSSI_THRESHOLD_MIN || 536 - rssi_lvl_toset > FM_RX_RSSI_THRESHOLD_MAX) { 537 - fmerr("Invalid RSSI threshold level\n"); 538 - return -EINVAL; 539 - } 540 - payload = (u16)rssi_lvl_toset; 541 - ret = fmc_send_cmd(fmdev, SEARCH_LVL_SET, REG_WR, &payload, 542 - sizeof(payload), NULL, NULL); 543 - if (ret < 0) 544 - return ret; 545 - 546 - fmdev->rx.rssi_threshold = rssi_lvl_toset; 547 - 548 - return 0; 549 - } 550 - 551 - /* Returns current RX RSSI threshold value */ 552 - int fm_rx_get_rssi_threshold(struct fmdev *fmdev, short *curr_rssi_lvl) 553 - { 554 - if (fmdev->curr_fmmode != FM_MODE_RX) 555 - return -EPERM; 556 - 557 - if (curr_rssi_lvl == NULL) { 558 - fmerr("Invalid memory\n"); 559 - return -ENOMEM; 560 - } 561 - 562 - *curr_rssi_lvl = fmdev->rx.rssi_threshold; 563 - 564 - return 0; 565 - } 566 - 567 - /* Sets RX stereo/mono modes */ 568 - int fm_rx_set_stereo_mono(struct fmdev *fmdev, u16 mode) 569 - { 570 - u16 payload; 571 - int ret; 572 - 573 - if (mode != FM_STEREO_MODE && mode != FM_MONO_MODE) { 574 - fmerr("Invalid mode\n"); 575 - return -EINVAL; 576 - } 577 - 578 - /* Set stereo/mono mode */ 579 - payload = (u16)mode; 580 - ret = fmc_send_cmd(fmdev, MOST_MODE_SET, REG_WR, &payload, 581 - sizeof(payload), NULL, NULL); 582 - if (ret < 0) 583 - return ret; 584 - 585 - /* Set stereo blending mode */ 586 - payload = FM_STEREO_SOFT_BLEND; 587 - ret = fmc_send_cmd(fmdev, MOST_BLEND_SET, REG_WR, &payload, 588 - sizeof(payload), NULL, NULL); 589 - if (ret < 0) 590 - return ret; 591 - 592 - return 0; 593 - } 594 - 595 - /* Gets current RX stereo/mono mode */ 596 - int fm_rx_get_stereo_mono(struct fmdev *fmdev, u16 *mode) 597 - { 598 - __be16 curr_mode; 599 - u32 resp_len; 600 - int ret; 601 - 602 - if (mode == NULL) { 603 - fmerr("Invalid memory\n"); 604 - return -ENOMEM; 605 - } 606 - 607 - ret = fmc_send_cmd(fmdev, MOST_MODE_SET, REG_RD, NULL, 2, 608 - &curr_mode, &resp_len); 609 - if (ret < 0) 610 - return ret; 611 - 612 - *mode = be16_to_cpu(curr_mode); 613 - 614 - return 0; 615 - } 616 - 617 - /* Choose RX de-emphasis filter mode (50us/75us) */ 618 - int fm_rx_set_deemphasis_mode(struct fmdev *fmdev, u16 mode) 619 - { 620 - u16 payload; 621 - int ret; 622 - 623 - if (fmdev->curr_fmmode != FM_MODE_RX) 624 - return -EPERM; 625 - 626 - if (mode != FM_RX_EMPHASIS_FILTER_50_USEC && 627 - mode != FM_RX_EMPHASIS_FILTER_75_USEC) { 628 - fmerr("Invalid rx de-emphasis mode (%d)\n", mode); 629 - return -EINVAL; 630 - } 631 - 632 - payload = mode; 633 - ret = fmc_send_cmd(fmdev, DEMPH_MODE_SET, REG_WR, &payload, 634 - sizeof(payload), NULL, NULL); 635 - if (ret < 0) 636 - return ret; 637 - 638 - fmdev->rx.deemphasis_mode = mode; 639 - 640 - return 0; 641 - } 642 - 643 - /* Gets current RX de-emphasis filter mode */ 644 - int fm_rx_get_deemph_mode(struct fmdev *fmdev, u16 *curr_deemphasis_mode) 645 - { 646 - if (fmdev->curr_fmmode != FM_MODE_RX) 647 - return -EPERM; 648 - 649 - if (curr_deemphasis_mode == NULL) { 650 - fmerr("Invalid memory\n"); 651 - return -ENOMEM; 652 - } 653 - 654 - *curr_deemphasis_mode = fmdev->rx.deemphasis_mode; 655 - 656 - return 0; 657 - } 658 - 659 - /* Enable/Disable RX RDS */ 660 - int fm_rx_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis) 661 - { 662 - u16 payload; 663 - int ret; 664 - 665 - if (rds_en_dis != FM_RDS_ENABLE && rds_en_dis != FM_RDS_DISABLE) { 666 - fmerr("Invalid rds option\n"); 667 - return -EINVAL; 668 - } 669 - 670 - if (rds_en_dis == FM_RDS_ENABLE 671 - && fmdev->rx.rds.flag == FM_RDS_DISABLE) { 672 - /* Turn on RX RDS and RDS circuit */ 673 - payload = FM_RX_PWR_SET_FM_AND_RDS_BLK_ON; 674 - ret = fmc_send_cmd(fmdev, POWER_SET, REG_WR, &payload, 675 - sizeof(payload), NULL, NULL); 676 - if (ret < 0) 677 - return ret; 678 - 679 - /* Clear and reset RDS FIFO */ 680 - payload = FM_RX_RDS_FLUSH_FIFO; 681 - ret = fmc_send_cmd(fmdev, RDS_CNTRL_SET, REG_WR, &payload, 682 - sizeof(payload), NULL, NULL); 683 - if (ret < 0) 684 - return ret; 685 - 686 - /* Read flags - just to clear any pending interrupts. */ 687 - ret = fmc_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, 2, 688 - NULL, NULL); 689 - if (ret < 0) 690 - return ret; 691 - 692 - /* Set RDS FIFO threshold value */ 693 - payload = FM_RX_RDS_FIFO_THRESHOLD; 694 - ret = fmc_send_cmd(fmdev, RDS_MEM_SET, REG_WR, &payload, 695 - sizeof(payload), NULL, NULL); 696 - if (ret < 0) 697 - return ret; 698 - 699 - /* Enable RDS interrupt */ 700 - fmdev->irq_info.mask |= FM_RDS_EVENT; 701 - payload = fmdev->irq_info.mask; 702 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 703 - sizeof(payload), NULL, NULL); 704 - if (ret < 0) { 705 - fmdev->irq_info.mask &= ~FM_RDS_EVENT; 706 - return ret; 707 - } 708 - 709 - /* Update our local flag */ 710 - fmdev->rx.rds.flag = FM_RDS_ENABLE; 711 - } else if (rds_en_dis == FM_RDS_DISABLE 712 - && fmdev->rx.rds.flag == FM_RDS_ENABLE) { 713 - /* Turn off RX RDS */ 714 - payload = FM_RX_PWR_SET_FM_ON_RDS_OFF; 715 - ret = fmc_send_cmd(fmdev, POWER_SET, REG_WR, &payload, 716 - sizeof(payload), NULL, NULL); 717 - if (ret < 0) 718 - return ret; 719 - 720 - /* Reset RDS pointers */ 721 - fmdev->rx.rds.last_blk_idx = 0; 722 - fmdev->rx.rds.wr_idx = 0; 723 - fmdev->rx.rds.rd_idx = 0; 724 - fm_rx_reset_station_info(fmdev); 725 - 726 - /* Update RDS local cache */ 727 - fmdev->irq_info.mask &= ~(FM_RDS_EVENT); 728 - fmdev->rx.rds.flag = FM_RDS_DISABLE; 729 - } 730 - 731 - return 0; 732 - } 733 - 734 - /* Returns current RX RDS enable/disable status */ 735 - int fm_rx_get_rds_mode(struct fmdev *fmdev, u8 *curr_rds_en_dis) 736 - { 737 - if (fmdev->curr_fmmode != FM_MODE_RX) 738 - return -EPERM; 739 - 740 - if (curr_rds_en_dis == NULL) { 741 - fmerr("Invalid memory\n"); 742 - return -ENOMEM; 743 - } 744 - 745 - *curr_rds_en_dis = fmdev->rx.rds.flag; 746 - 747 - return 0; 748 - } 749 - 750 - /* Sets RDS operation mode (RDS/RDBS) */ 751 - int fm_rx_set_rds_system(struct fmdev *fmdev, u8 rds_mode) 752 - { 753 - u16 payload; 754 - int ret; 755 - 756 - if (fmdev->curr_fmmode != FM_MODE_RX) 757 - return -EPERM; 758 - 759 - if (rds_mode != FM_RDS_SYSTEM_RDS && rds_mode != FM_RDS_SYSTEM_RBDS) { 760 - fmerr("Invalid rds mode\n"); 761 - return -EINVAL; 762 - } 763 - /* Set RDS operation mode */ 764 - payload = (u16)rds_mode; 765 - ret = fmc_send_cmd(fmdev, RDS_SYSTEM_SET, REG_WR, &payload, 766 - sizeof(payload), NULL, NULL); 767 - if (ret < 0) 768 - return ret; 769 - 770 - fmdev->rx.rds_mode = rds_mode; 771 - 772 - return 0; 773 - } 774 - 775 - /* Configures Alternate Frequency switch mode */ 776 - int fm_rx_set_af_switch(struct fmdev *fmdev, u8 af_mode) 777 - { 778 - u16 payload; 779 - int ret; 780 - 781 - if (fmdev->curr_fmmode != FM_MODE_RX) 782 - return -EPERM; 783 - 784 - if (af_mode != FM_RX_RDS_AF_SWITCH_MODE_ON && 785 - af_mode != FM_RX_RDS_AF_SWITCH_MODE_OFF) { 786 - fmerr("Invalid af mode\n"); 787 - return -EINVAL; 788 - } 789 - /* Enable/disable low RSSI interrupt based on af_mode */ 790 - if (af_mode == FM_RX_RDS_AF_SWITCH_MODE_ON) 791 - fmdev->irq_info.mask |= FM_LEV_EVENT; 792 - else 793 - fmdev->irq_info.mask &= ~FM_LEV_EVENT; 794 - 795 - payload = fmdev->irq_info.mask; 796 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 797 - sizeof(payload), NULL, NULL); 798 - if (ret < 0) 799 - return ret; 800 - 801 - fmdev->rx.af_mode = af_mode; 802 - 803 - return 0; 804 - } 805 - 806 - /* Returns Alternate Frequency switch status */ 807 - int fm_rx_get_af_switch(struct fmdev *fmdev, u8 *af_mode) 808 - { 809 - if (fmdev->curr_fmmode != FM_MODE_RX) 810 - return -EPERM; 811 - 812 - if (af_mode == NULL) { 813 - fmerr("Invalid memory\n"); 814 - return -ENOMEM; 815 - } 816 - 817 - *af_mode = fmdev->rx.af_mode; 818 - 819 - return 0; 820 - }
-45
drivers/media/radio/wl128x/fmdrv_rx.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * FM RX module header. 5 - * 6 - * Copyright (C) 2011 Texas Instruments 7 - */ 8 - 9 - #ifndef _FMDRV_RX_H 10 - #define _FMDRV_RX_H 11 - 12 - int fm_rx_set_freq(struct fmdev *, u32); 13 - int fm_rx_set_mute_mode(struct fmdev *, u8); 14 - int fm_rx_set_stereo_mono(struct fmdev *, u16); 15 - int fm_rx_set_rds_mode(struct fmdev *, u8); 16 - int fm_rx_set_rds_system(struct fmdev *, u8); 17 - int fm_rx_set_volume(struct fmdev *, u16); 18 - int fm_rx_set_rssi_threshold(struct fmdev *, short); 19 - int fm_rx_set_region(struct fmdev *, u8); 20 - int fm_rx_set_rfdepend_softmute(struct fmdev *, u8); 21 - int fm_rx_set_deemphasis_mode(struct fmdev *, u16); 22 - int fm_rx_set_af_switch(struct fmdev *, u8); 23 - 24 - void fm_rx_reset_rds_cache(struct fmdev *); 25 - void fm_rx_reset_station_info(struct fmdev *); 26 - 27 - int fm_rx_seek(struct fmdev *, u32, u32, u32); 28 - 29 - int fm_rx_get_rds_mode(struct fmdev *, u8 *); 30 - int fm_rx_get_mute_mode(struct fmdev *, u8 *); 31 - int fm_rx_get_volume(struct fmdev *, u16 *); 32 - int fm_rx_get_band_freq_range(struct fmdev *, 33 - u32 *, u32 *); 34 - int fm_rx_get_stereo_mono(struct fmdev *, u16 *); 35 - int fm_rx_get_rssi_level(struct fmdev *, u16 *); 36 - int fm_rx_get_rssi_threshold(struct fmdev *, short *); 37 - int fm_rx_get_rfdepend_softmute(struct fmdev *, u8 *); 38 - int fm_rx_get_deemph_mode(struct fmdev *, u16 *); 39 - int fm_rx_get_af_switch(struct fmdev *, u8 *); 40 - void fm_rx_get_region(struct fmdev *, u8 *); 41 - 42 - int fm_rx_set_chanl_spacing(struct fmdev *, u8); 43 - int fm_rx_get_chanl_spacing(struct fmdev *, u8 *); 44 - #endif 45 -
-413
drivers/media/radio/wl128x/fmdrv_tx.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * This sub-module of FM driver implements FM TX functionality. 5 - * 6 - * Copyright (C) 2011 Texas Instruments 7 - */ 8 - 9 - #include <linux/delay.h> 10 - #include "fmdrv.h" 11 - #include "fmdrv_common.h" 12 - #include "fmdrv_tx.h" 13 - 14 - int fm_tx_set_stereo_mono(struct fmdev *fmdev, u16 mode) 15 - { 16 - u16 payload; 17 - int ret; 18 - 19 - if (fmdev->tx_data.aud_mode == mode) 20 - return 0; 21 - 22 - fmdbg("stereo mode: %d\n", mode); 23 - 24 - /* Set Stereo/Mono mode */ 25 - payload = (1 - mode); 26 - ret = fmc_send_cmd(fmdev, MONO_SET, REG_WR, &payload, 27 - sizeof(payload), NULL, NULL); 28 - if (ret < 0) 29 - return ret; 30 - 31 - fmdev->tx_data.aud_mode = mode; 32 - 33 - return ret; 34 - } 35 - 36 - static int set_rds_text(struct fmdev *fmdev, u8 *rds_text) 37 - { 38 - u16 payload; 39 - int ret; 40 - 41 - ret = fmc_send_cmd(fmdev, RDS_DATA_SET, REG_WR, rds_text, 42 - strlen(rds_text), NULL, NULL); 43 - if (ret < 0) 44 - return ret; 45 - 46 - /* Scroll mode */ 47 - payload = (u16)0x1; 48 - ret = fmc_send_cmd(fmdev, DISPLAY_MODE, REG_WR, &payload, 49 - sizeof(payload), NULL, NULL); 50 - if (ret < 0) 51 - return ret; 52 - 53 - return 0; 54 - } 55 - 56 - static int set_rds_data_mode(struct fmdev *fmdev, u8 mode) 57 - { 58 - u16 payload; 59 - int ret; 60 - 61 - /* Setting unique PI TODO: how unique? */ 62 - payload = (u16)0xcafe; 63 - ret = fmc_send_cmd(fmdev, PI_SET, REG_WR, &payload, 64 - sizeof(payload), NULL, NULL); 65 - if (ret < 0) 66 - return ret; 67 - 68 - /* Set decoder id */ 69 - payload = (u16)0xa; 70 - ret = fmc_send_cmd(fmdev, DI_SET, REG_WR, &payload, 71 - sizeof(payload), NULL, NULL); 72 - if (ret < 0) 73 - return ret; 74 - 75 - /* TODO: RDS_MODE_GET? */ 76 - return 0; 77 - } 78 - 79 - static int set_rds_len(struct fmdev *fmdev, u8 type, u16 len) 80 - { 81 - u16 payload; 82 - int ret; 83 - 84 - len |= type << 8; 85 - payload = len; 86 - ret = fmc_send_cmd(fmdev, RDS_CONFIG_DATA_SET, REG_WR, &payload, 87 - sizeof(payload), NULL, NULL); 88 - if (ret < 0) 89 - return ret; 90 - 91 - /* TODO: LENGTH_GET? */ 92 - return 0; 93 - } 94 - 95 - int fm_tx_set_rds_mode(struct fmdev *fmdev, u8 rds_en_dis) 96 - { 97 - u16 payload; 98 - int ret; 99 - u8 rds_text[] = "Zoom2\n"; 100 - 101 - fmdbg("rds_en_dis:%d(E:%d, D:%d)\n", rds_en_dis, 102 - FM_RDS_ENABLE, FM_RDS_DISABLE); 103 - 104 - if (rds_en_dis == FM_RDS_ENABLE) { 105 - /* Set RDS length */ 106 - set_rds_len(fmdev, 0, strlen(rds_text)); 107 - 108 - /* Set RDS text */ 109 - set_rds_text(fmdev, rds_text); 110 - 111 - /* Set RDS mode */ 112 - set_rds_data_mode(fmdev, 0x0); 113 - } 114 - 115 - /* Send command to enable RDS */ 116 - if (rds_en_dis == FM_RDS_ENABLE) 117 - payload = 0x01; 118 - else 119 - payload = 0x00; 120 - 121 - ret = fmc_send_cmd(fmdev, RDS_DATA_ENB, REG_WR, &payload, 122 - sizeof(payload), NULL, NULL); 123 - if (ret < 0) 124 - return ret; 125 - 126 - if (rds_en_dis == FM_RDS_ENABLE) { 127 - /* Set RDS length */ 128 - set_rds_len(fmdev, 0, strlen(rds_text)); 129 - 130 - /* Set RDS text */ 131 - set_rds_text(fmdev, rds_text); 132 - } 133 - fmdev->tx_data.rds.flag = rds_en_dis; 134 - 135 - return 0; 136 - } 137 - 138 - int fm_tx_set_radio_text(struct fmdev *fmdev, u8 *rds_text, u8 rds_type) 139 - { 140 - u16 payload; 141 - int ret; 142 - 143 - if (fmdev->curr_fmmode != FM_MODE_TX) 144 - return -EPERM; 145 - 146 - fm_tx_set_rds_mode(fmdev, 0); 147 - 148 - /* Set RDS length */ 149 - set_rds_len(fmdev, rds_type, strlen(rds_text)); 150 - 151 - /* Set RDS text */ 152 - set_rds_text(fmdev, rds_text); 153 - 154 - /* Set RDS mode */ 155 - set_rds_data_mode(fmdev, 0x0); 156 - 157 - payload = 1; 158 - ret = fmc_send_cmd(fmdev, RDS_DATA_ENB, REG_WR, &payload, 159 - sizeof(payload), NULL, NULL); 160 - if (ret < 0) 161 - return ret; 162 - 163 - return 0; 164 - } 165 - 166 - int fm_tx_set_af(struct fmdev *fmdev, u32 af) 167 - { 168 - u16 payload; 169 - int ret; 170 - 171 - if (fmdev->curr_fmmode != FM_MODE_TX) 172 - return -EPERM; 173 - 174 - fmdbg("AF: %d\n", af); 175 - 176 - af = (af - 87500) / 100; 177 - payload = (u16)af; 178 - ret = fmc_send_cmd(fmdev, TA_SET, REG_WR, &payload, 179 - sizeof(payload), NULL, NULL); 180 - if (ret < 0) 181 - return ret; 182 - 183 - return 0; 184 - } 185 - 186 - int fm_tx_set_region(struct fmdev *fmdev, u8 region) 187 - { 188 - u16 payload; 189 - int ret; 190 - 191 - if (region != FM_BAND_EUROPE_US && region != FM_BAND_JAPAN) { 192 - fmerr("Invalid band\n"); 193 - return -EINVAL; 194 - } 195 - 196 - /* Send command to set the band */ 197 - payload = (u16)region; 198 - ret = fmc_send_cmd(fmdev, TX_BAND_SET, REG_WR, &payload, 199 - sizeof(payload), NULL, NULL); 200 - if (ret < 0) 201 - return ret; 202 - 203 - return 0; 204 - } 205 - 206 - int fm_tx_set_mute_mode(struct fmdev *fmdev, u8 mute_mode_toset) 207 - { 208 - u16 payload; 209 - int ret; 210 - 211 - fmdbg("tx: mute mode %d\n", mute_mode_toset); 212 - 213 - payload = mute_mode_toset; 214 - ret = fmc_send_cmd(fmdev, MUTE, REG_WR, &payload, 215 - sizeof(payload), NULL, NULL); 216 - if (ret < 0) 217 - return ret; 218 - 219 - return 0; 220 - } 221 - 222 - /* Set TX Audio I/O */ 223 - static int set_audio_io(struct fmdev *fmdev) 224 - { 225 - struct fmtx_data *tx = &fmdev->tx_data; 226 - u16 payload; 227 - int ret; 228 - 229 - /* Set Audio I/O Enable */ 230 - payload = tx->audio_io; 231 - ret = fmc_send_cmd(fmdev, AUDIO_IO_SET, REG_WR, &payload, 232 - sizeof(payload), NULL, NULL); 233 - if (ret < 0) 234 - return ret; 235 - 236 - /* TODO: is audio set? */ 237 - return 0; 238 - } 239 - 240 - /* Start TX Transmission */ 241 - static int enable_xmit(struct fmdev *fmdev, u8 new_xmit_state) 242 - { 243 - struct fmtx_data *tx = &fmdev->tx_data; 244 - unsigned long timeleft; 245 - u16 payload; 246 - int ret; 247 - 248 - /* Enable POWER_ENB interrupts */ 249 - payload = FM_POW_ENB_EVENT; 250 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 251 - sizeof(payload), NULL, NULL); 252 - if (ret < 0) 253 - return ret; 254 - 255 - /* Set Power Enable */ 256 - payload = new_xmit_state; 257 - ret = fmc_send_cmd(fmdev, POWER_ENB_SET, REG_WR, &payload, 258 - sizeof(payload), NULL, NULL); 259 - if (ret < 0) 260 - return ret; 261 - 262 - /* Wait for Power Enabled */ 263 - init_completion(&fmdev->maintask_comp); 264 - timeleft = wait_for_completion_timeout(&fmdev->maintask_comp, 265 - FM_DRV_TX_TIMEOUT); 266 - if (!timeleft) { 267 - fmerr("Timeout(%d sec),didn't get tune ended interrupt\n", 268 - jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); 269 - return -ETIMEDOUT; 270 - } 271 - 272 - set_bit(FM_CORE_TX_XMITING, &fmdev->flag); 273 - tx->xmit_state = new_xmit_state; 274 - 275 - return 0; 276 - } 277 - 278 - /* Set TX power level */ 279 - int fm_tx_set_pwr_lvl(struct fmdev *fmdev, u8 new_pwr_lvl) 280 - { 281 - u16 payload; 282 - struct fmtx_data *tx = &fmdev->tx_data; 283 - int ret; 284 - 285 - if (fmdev->curr_fmmode != FM_MODE_TX) 286 - return -EPERM; 287 - fmdbg("tx: pwr_level_to_set %ld\n", (long int)new_pwr_lvl); 288 - 289 - /* If the core isn't ready update global variable */ 290 - if (!test_bit(FM_CORE_READY, &fmdev->flag)) { 291 - tx->pwr_lvl = new_pwr_lvl; 292 - return 0; 293 - } 294 - 295 - /* Set power level: Application will specify power level value in 296 - * units of dB/uV, whereas range and step are specific to FM chip. 297 - * For TI's WL chips, convert application specified power level value 298 - * to chip specific value by subtracting 122 from it. Refer to TI FM 299 - * data sheet for details. 300 - * */ 301 - 302 - payload = (FM_PWR_LVL_HIGH - new_pwr_lvl); 303 - ret = fmc_send_cmd(fmdev, POWER_LEV_SET, REG_WR, &payload, 304 - sizeof(payload), NULL, NULL); 305 - if (ret < 0) 306 - return ret; 307 - 308 - /* TODO: is the power level set? */ 309 - tx->pwr_lvl = new_pwr_lvl; 310 - 311 - return 0; 312 - } 313 - 314 - /* 315 - * Sets FM TX pre-emphasis filter value (OFF, 50us, or 75us) 316 - * Convert V4L2 specified filter values to chip specific filter values. 317 - */ 318 - int fm_tx_set_preemph_filter(struct fmdev *fmdev, u32 preemphasis) 319 - { 320 - struct fmtx_data *tx = &fmdev->tx_data; 321 - u16 payload; 322 - int ret; 323 - 324 - if (fmdev->curr_fmmode != FM_MODE_TX) 325 - return -EPERM; 326 - 327 - switch (preemphasis) { 328 - case V4L2_PREEMPHASIS_DISABLED: 329 - payload = FM_TX_PREEMPH_OFF; 330 - break; 331 - case V4L2_PREEMPHASIS_50_uS: 332 - payload = FM_TX_PREEMPH_50US; 333 - break; 334 - case V4L2_PREEMPHASIS_75_uS: 335 - payload = FM_TX_PREEMPH_75US; 336 - break; 337 - } 338 - 339 - ret = fmc_send_cmd(fmdev, PREMPH_SET, REG_WR, &payload, 340 - sizeof(payload), NULL, NULL); 341 - if (ret < 0) 342 - return ret; 343 - 344 - tx->preemph = payload; 345 - 346 - return ret; 347 - } 348 - 349 - /* Get the TX tuning capacitor value.*/ 350 - int fm_tx_get_tune_cap_val(struct fmdev *fmdev) 351 - { 352 - u16 curr_val; 353 - u32 resp_len; 354 - int ret; 355 - 356 - if (fmdev->curr_fmmode != FM_MODE_TX) 357 - return -EPERM; 358 - 359 - ret = fmc_send_cmd(fmdev, READ_FMANT_TUNE_VALUE, REG_RD, 360 - NULL, sizeof(curr_val), &curr_val, &resp_len); 361 - if (ret < 0) 362 - return ret; 363 - 364 - curr_val = be16_to_cpu((__force __be16)curr_val); 365 - 366 - return curr_val; 367 - } 368 - 369 - /* Set TX Frequency */ 370 - int fm_tx_set_freq(struct fmdev *fmdev, u32 freq_to_set) 371 - { 372 - struct fmtx_data *tx = &fmdev->tx_data; 373 - u16 payload, chanl_index; 374 - int ret; 375 - 376 - if (test_bit(FM_CORE_TX_XMITING, &fmdev->flag)) { 377 - enable_xmit(fmdev, 0); 378 - clear_bit(FM_CORE_TX_XMITING, &fmdev->flag); 379 - } 380 - 381 - /* Enable FR, BL interrupts */ 382 - payload = (FM_FR_EVENT | FM_BL_EVENT); 383 - ret = fmc_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, 384 - sizeof(payload), NULL, NULL); 385 - if (ret < 0) 386 - return ret; 387 - 388 - tx->tx_frq = (unsigned long)freq_to_set; 389 - fmdbg("tx: freq_to_set %ld\n", (long int)tx->tx_frq); 390 - 391 - chanl_index = freq_to_set / 10; 392 - 393 - /* Set current tuner channel */ 394 - payload = chanl_index; 395 - ret = fmc_send_cmd(fmdev, CHANL_SET, REG_WR, &payload, 396 - sizeof(payload), NULL, NULL); 397 - if (ret < 0) 398 - return ret; 399 - 400 - fm_tx_set_pwr_lvl(fmdev, tx->pwr_lvl); 401 - fm_tx_set_preemph_filter(fmdev, tx->preemph); 402 - 403 - tx->audio_io = 0x01; /* I2S */ 404 - set_audio_io(fmdev); 405 - 406 - enable_xmit(fmdev, 0x01); /* Enable transmission */ 407 - 408 - tx->aud_mode = FM_STEREO_MODE; 409 - tx->rds.flag = FM_RDS_DISABLE; 410 - 411 - return 0; 412 - } 413 -
-24
drivers/media/radio/wl128x/fmdrv_tx.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * FM TX module header. 5 - * 6 - * Copyright (C) 2011 Texas Instruments 7 - */ 8 - 9 - #ifndef _FMDRV_TX_H 10 - #define _FMDRV_TX_H 11 - 12 - int fm_tx_set_freq(struct fmdev *, u32); 13 - int fm_tx_set_pwr_lvl(struct fmdev *, u8); 14 - int fm_tx_set_region(struct fmdev *, u8); 15 - int fm_tx_set_mute_mode(struct fmdev *, u8); 16 - int fm_tx_set_stereo_mono(struct fmdev *, u16); 17 - int fm_tx_set_rds_mode(struct fmdev *, u8); 18 - int fm_tx_set_radio_text(struct fmdev *, u8 *, u8); 19 - int fm_tx_set_af(struct fmdev *, u32); 20 - int fm_tx_set_preemph_filter(struct fmdev *, u32); 21 - int fm_tx_get_tune_cap_val(struct fmdev *); 22 - 23 - #endif 24 -
-604
drivers/media/radio/wl128x/fmdrv_v4l2.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-only 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * This file provides interfaces to V4L2 subsystem. 5 - * 6 - * This module registers with V4L2 subsystem as Radio 7 - * data system interface (/dev/radio). During the registration, 8 - * it will expose two set of function pointers. 9 - * 10 - * 1) File operation related API (open, close, read, write, poll...etc). 11 - * 2) Set of V4L2 IOCTL complaint API. 12 - * 13 - * Copyright (C) 2011 Texas Instruments 14 - * Author: Raja Mani <raja_mani@ti.com> 15 - * Author: Manjunatha Halli <manjunatha_halli@ti.com> 16 - */ 17 - 18 - #include <linux/export.h> 19 - 20 - #include "fmdrv.h" 21 - #include "fmdrv_v4l2.h" 22 - #include "fmdrv_common.h" 23 - #include "fmdrv_rx.h" 24 - #include "fmdrv_tx.h" 25 - 26 - static struct video_device gradio_dev; 27 - static u8 radio_disconnected; 28 - 29 - /* -- V4L2 RADIO (/dev/radioX) device file operation interfaces --- */ 30 - 31 - /* Read RX RDS data */ 32 - static ssize_t fm_v4l2_fops_read(struct file *file, char __user * buf, 33 - size_t count, loff_t *ppos) 34 - { 35 - u8 rds_mode; 36 - int ret; 37 - struct fmdev *fmdev; 38 - 39 - fmdev = video_drvdata(file); 40 - 41 - if (!radio_disconnected) { 42 - fmerr("FM device is already disconnected\n"); 43 - return -EIO; 44 - } 45 - 46 - if (mutex_lock_interruptible(&fmdev->mutex)) 47 - return -ERESTARTSYS; 48 - 49 - /* Turn on RDS mode if it is disabled */ 50 - ret = fm_rx_get_rds_mode(fmdev, &rds_mode); 51 - if (ret < 0) { 52 - fmerr("Unable to read current rds mode\n"); 53 - goto read_unlock; 54 - } 55 - 56 - if (rds_mode == FM_RDS_DISABLE) { 57 - ret = fmc_set_rds_mode(fmdev, FM_RDS_ENABLE); 58 - if (ret < 0) { 59 - fmerr("Failed to enable rds mode\n"); 60 - goto read_unlock; 61 - } 62 - } 63 - 64 - /* Copy RDS data from internal buffer to user buffer */ 65 - ret = fmc_transfer_rds_from_internal_buff(fmdev, file, buf, count); 66 - read_unlock: 67 - mutex_unlock(&fmdev->mutex); 68 - return ret; 69 - } 70 - 71 - /* Write TX RDS data */ 72 - static ssize_t fm_v4l2_fops_write(struct file *file, const char __user * buf, 73 - size_t count, loff_t *ppos) 74 - { 75 - struct tx_rds rds; 76 - int ret; 77 - struct fmdev *fmdev; 78 - 79 - ret = copy_from_user(&rds, buf, sizeof(rds)); 80 - rds.text[sizeof(rds.text) - 1] = '\0'; 81 - fmdbg("(%d)type: %d, text %s, af %d\n", 82 - ret, rds.text_type, rds.text, rds.af_freq); 83 - if (ret) 84 - return -EFAULT; 85 - 86 - fmdev = video_drvdata(file); 87 - if (mutex_lock_interruptible(&fmdev->mutex)) 88 - return -ERESTARTSYS; 89 - fm_tx_set_radio_text(fmdev, rds.text, rds.text_type); 90 - fm_tx_set_af(fmdev, rds.af_freq); 91 - mutex_unlock(&fmdev->mutex); 92 - 93 - return sizeof(rds); 94 - } 95 - 96 - static __poll_t fm_v4l2_fops_poll(struct file *file, struct poll_table_struct *pts) 97 - { 98 - int ret; 99 - struct fmdev *fmdev; 100 - 101 - fmdev = video_drvdata(file); 102 - mutex_lock(&fmdev->mutex); 103 - ret = fmc_is_rds_data_available(fmdev, file, pts); 104 - mutex_unlock(&fmdev->mutex); 105 - if (ret < 0) 106 - return EPOLLIN | EPOLLRDNORM; 107 - 108 - return 0; 109 - } 110 - 111 - /* 112 - * Handle open request for "/dev/radioX" device. 113 - * Start with FM RX mode as default. 114 - */ 115 - static int fm_v4l2_fops_open(struct file *file) 116 - { 117 - int ret; 118 - struct fmdev *fmdev = NULL; 119 - 120 - /* Don't allow multiple open */ 121 - if (radio_disconnected) { 122 - fmerr("FM device is already opened\n"); 123 - return -EBUSY; 124 - } 125 - 126 - fmdev = video_drvdata(file); 127 - 128 - if (mutex_lock_interruptible(&fmdev->mutex)) 129 - return -ERESTARTSYS; 130 - ret = fmc_prepare(fmdev); 131 - if (ret < 0) { 132 - fmerr("Unable to prepare FM CORE\n"); 133 - goto open_unlock; 134 - } 135 - 136 - fmdbg("Load FM RX firmware..\n"); 137 - 138 - ret = fmc_set_mode(fmdev, FM_MODE_RX); 139 - if (ret < 0) { 140 - fmerr("Unable to load FM RX firmware\n"); 141 - goto open_unlock; 142 - } 143 - radio_disconnected = 1; 144 - 145 - open_unlock: 146 - mutex_unlock(&fmdev->mutex); 147 - return ret; 148 - } 149 - 150 - static int fm_v4l2_fops_release(struct file *file) 151 - { 152 - int ret; 153 - struct fmdev *fmdev; 154 - 155 - fmdev = video_drvdata(file); 156 - if (!radio_disconnected) { 157 - fmdbg("FM device is already closed\n"); 158 - return 0; 159 - } 160 - 161 - mutex_lock(&fmdev->mutex); 162 - ret = fmc_set_mode(fmdev, FM_MODE_OFF); 163 - if (ret < 0) { 164 - fmerr("Unable to turn off the chip\n"); 165 - goto release_unlock; 166 - } 167 - 168 - ret = fmc_release(fmdev); 169 - if (ret < 0) { 170 - fmerr("FM CORE release failed\n"); 171 - goto release_unlock; 172 - } 173 - radio_disconnected = 0; 174 - 175 - release_unlock: 176 - mutex_unlock(&fmdev->mutex); 177 - return ret; 178 - } 179 - 180 - /* V4L2 RADIO (/dev/radioX) device IOCTL interfaces */ 181 - static int fm_v4l2_vidioc_querycap(struct file *file, void *priv, 182 - struct v4l2_capability *capability) 183 - { 184 - strscpy(capability->driver, FM_DRV_NAME, sizeof(capability->driver)); 185 - strscpy(capability->card, FM_DRV_CARD_SHORT_NAME, 186 - sizeof(capability->card)); 187 - sprintf(capability->bus_info, "UART"); 188 - return 0; 189 - } 190 - 191 - static int fm_g_volatile_ctrl(struct v4l2_ctrl *ctrl) 192 - { 193 - struct fmdev *fmdev = container_of(ctrl->handler, 194 - struct fmdev, ctrl_handler); 195 - 196 - switch (ctrl->id) { 197 - case V4L2_CID_TUNE_ANTENNA_CAPACITOR: 198 - ctrl->val = fm_tx_get_tune_cap_val(fmdev); 199 - break; 200 - default: 201 - fmwarn("%s: Unknown IOCTL: %d\n", __func__, ctrl->id); 202 - break; 203 - } 204 - 205 - return 0; 206 - } 207 - 208 - static int fm_v4l2_s_ctrl(struct v4l2_ctrl *ctrl) 209 - { 210 - struct fmdev *fmdev = container_of(ctrl->handler, 211 - struct fmdev, ctrl_handler); 212 - 213 - switch (ctrl->id) { 214 - case V4L2_CID_AUDIO_VOLUME: /* set volume */ 215 - return fm_rx_set_volume(fmdev, (u16)ctrl->val); 216 - 217 - case V4L2_CID_AUDIO_MUTE: /* set mute */ 218 - return fmc_set_mute_mode(fmdev, (u8)ctrl->val); 219 - 220 - case V4L2_CID_TUNE_POWER_LEVEL: 221 - /* set TX power level - ext control */ 222 - return fm_tx_set_pwr_lvl(fmdev, (u8)ctrl->val); 223 - 224 - case V4L2_CID_TUNE_PREEMPHASIS: 225 - return fm_tx_set_preemph_filter(fmdev, (u8) ctrl->val); 226 - 227 - default: 228 - return -EINVAL; 229 - } 230 - } 231 - 232 - static int fm_v4l2_vidioc_g_audio(struct file *file, void *priv, 233 - struct v4l2_audio *audio) 234 - { 235 - memset(audio, 0, sizeof(*audio)); 236 - strscpy(audio->name, "Radio", sizeof(audio->name)); 237 - audio->capability = V4L2_AUDCAP_STEREO; 238 - 239 - return 0; 240 - } 241 - 242 - static int fm_v4l2_vidioc_s_audio(struct file *file, void *priv, 243 - const struct v4l2_audio *audio) 244 - { 245 - if (audio->index != 0) 246 - return -EINVAL; 247 - 248 - return 0; 249 - } 250 - 251 - /* Get tuner attributes. If current mode is NOT RX, return error */ 252 - static int fm_v4l2_vidioc_g_tuner(struct file *file, void *priv, 253 - struct v4l2_tuner *tuner) 254 - { 255 - struct fmdev *fmdev = video_drvdata(file); 256 - u32 bottom_freq; 257 - u32 top_freq; 258 - u16 stereo_mono_mode; 259 - u16 rssilvl; 260 - int ret; 261 - 262 - if (tuner->index != 0) 263 - return -EINVAL; 264 - 265 - if (fmdev->curr_fmmode != FM_MODE_RX) 266 - return -EPERM; 267 - 268 - ret = fm_rx_get_band_freq_range(fmdev, &bottom_freq, &top_freq); 269 - if (ret != 0) 270 - return ret; 271 - 272 - ret = fm_rx_get_stereo_mono(fmdev, &stereo_mono_mode); 273 - if (ret != 0) 274 - return ret; 275 - 276 - ret = fm_rx_get_rssi_level(fmdev, &rssilvl); 277 - if (ret != 0) 278 - return ret; 279 - 280 - strscpy(tuner->name, "FM", sizeof(tuner->name)); 281 - tuner->type = V4L2_TUNER_RADIO; 282 - /* Store rangelow and rangehigh freq in unit of 62.5 Hz */ 283 - tuner->rangelow = bottom_freq * 16; 284 - tuner->rangehigh = top_freq * 16; 285 - tuner->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO | 286 - ((fmdev->rx.rds.flag == FM_RDS_ENABLE) ? V4L2_TUNER_SUB_RDS : 0); 287 - tuner->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_RDS | 288 - V4L2_TUNER_CAP_LOW | 289 - V4L2_TUNER_CAP_HWSEEK_BOUNDED | 290 - V4L2_TUNER_CAP_HWSEEK_WRAP; 291 - tuner->audmode = (stereo_mono_mode ? 292 - V4L2_TUNER_MODE_MONO : V4L2_TUNER_MODE_STEREO); 293 - 294 - /* 295 - * Actual rssi value lies in between -128 to +127. 296 - * Convert this range from 0 to 255 by adding +128 297 - */ 298 - rssilvl += 128; 299 - 300 - /* 301 - * Return signal strength value should be within 0 to 65535. 302 - * Find out correct signal radio by multiplying (65535/255) = 257 303 - */ 304 - tuner->signal = rssilvl * 257; 305 - tuner->afc = 0; 306 - 307 - return ret; 308 - } 309 - 310 - /* 311 - * Set tuner attributes. If current mode is NOT RX, set to RX. 312 - * Currently, we set only audio mode (mono/stereo) and RDS state (on/off). 313 - * Should we set other tuner attributes, too? 314 - */ 315 - static int fm_v4l2_vidioc_s_tuner(struct file *file, void *priv, 316 - const struct v4l2_tuner *tuner) 317 - { 318 - struct fmdev *fmdev = video_drvdata(file); 319 - u16 aud_mode; 320 - u8 rds_mode; 321 - int ret; 322 - 323 - if (tuner->index != 0) 324 - return -EINVAL; 325 - 326 - aud_mode = (tuner->audmode == V4L2_TUNER_MODE_STEREO) ? 327 - FM_STEREO_MODE : FM_MONO_MODE; 328 - rds_mode = (tuner->rxsubchans & V4L2_TUNER_SUB_RDS) ? 329 - FM_RDS_ENABLE : FM_RDS_DISABLE; 330 - 331 - if (fmdev->curr_fmmode != FM_MODE_RX) { 332 - ret = fmc_set_mode(fmdev, FM_MODE_RX); 333 - if (ret < 0) { 334 - fmerr("Failed to set RX mode\n"); 335 - return ret; 336 - } 337 - } 338 - 339 - ret = fmc_set_stereo_mono(fmdev, aud_mode); 340 - if (ret < 0) { 341 - fmerr("Failed to set RX stereo/mono mode\n"); 342 - return ret; 343 - } 344 - 345 - ret = fmc_set_rds_mode(fmdev, rds_mode); 346 - if (ret < 0) 347 - fmerr("Failed to set RX RDS mode\n"); 348 - 349 - return ret; 350 - } 351 - 352 - /* Get tuner or modulator radio frequency */ 353 - static int fm_v4l2_vidioc_g_freq(struct file *file, void *priv, 354 - struct v4l2_frequency *freq) 355 - { 356 - struct fmdev *fmdev = video_drvdata(file); 357 - int ret; 358 - 359 - ret = fmc_get_freq(fmdev, &freq->frequency); 360 - if (ret < 0) { 361 - fmerr("Failed to get frequency\n"); 362 - return ret; 363 - } 364 - 365 - /* Frequency unit of 62.5 Hz*/ 366 - freq->frequency = (u32) freq->frequency * 16; 367 - 368 - return 0; 369 - } 370 - 371 - /* Set tuner or modulator radio frequency */ 372 - static int fm_v4l2_vidioc_s_freq(struct file *file, void *priv, 373 - const struct v4l2_frequency *freq) 374 - { 375 - struct fmdev *fmdev = video_drvdata(file); 376 - 377 - /* 378 - * As V4L2_TUNER_CAP_LOW is set 1 user sends the frequency 379 - * in units of 62.5 Hz. 380 - */ 381 - return fmc_set_freq(fmdev, freq->frequency / 16); 382 - } 383 - 384 - /* Set hardware frequency seek. If current mode is NOT RX, set it RX. */ 385 - static int fm_v4l2_vidioc_s_hw_freq_seek(struct file *file, void *priv, 386 - const struct v4l2_hw_freq_seek *seek) 387 - { 388 - struct fmdev *fmdev = video_drvdata(file); 389 - int ret; 390 - 391 - if (file->f_flags & O_NONBLOCK) 392 - return -EWOULDBLOCK; 393 - 394 - if (fmdev->curr_fmmode != FM_MODE_RX) { 395 - ret = fmc_set_mode(fmdev, FM_MODE_RX); 396 - if (ret != 0) { 397 - fmerr("Failed to set RX mode\n"); 398 - return ret; 399 - } 400 - } 401 - 402 - ret = fm_rx_seek(fmdev, seek->seek_upward, seek->wrap_around, 403 - seek->spacing); 404 - if (ret < 0) 405 - fmerr("RX seek failed - %d\n", ret); 406 - 407 - return ret; 408 - } 409 - /* Get modulator attributes. If mode is not TX, return no attributes. */ 410 - static int fm_v4l2_vidioc_g_modulator(struct file *file, void *priv, 411 - struct v4l2_modulator *mod) 412 - { 413 - struct fmdev *fmdev = video_drvdata(file); 414 - 415 - if (mod->index != 0) 416 - return -EINVAL; 417 - 418 - if (fmdev->curr_fmmode != FM_MODE_TX) 419 - return -EPERM; 420 - 421 - mod->txsubchans = ((fmdev->tx_data.aud_mode == FM_STEREO_MODE) ? 422 - V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO) | 423 - ((fmdev->tx_data.rds.flag == FM_RDS_ENABLE) ? 424 - V4L2_TUNER_SUB_RDS : 0); 425 - 426 - mod->capability = V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_RDS | 427 - V4L2_TUNER_CAP_LOW; 428 - 429 - return 0; 430 - } 431 - 432 - /* Set modulator attributes. If mode is not TX, set to TX. */ 433 - static int fm_v4l2_vidioc_s_modulator(struct file *file, void *priv, 434 - const struct v4l2_modulator *mod) 435 - { 436 - struct fmdev *fmdev = video_drvdata(file); 437 - u8 rds_mode; 438 - u16 aud_mode; 439 - int ret; 440 - 441 - if (mod->index != 0) 442 - return -EINVAL; 443 - 444 - if (fmdev->curr_fmmode != FM_MODE_TX) { 445 - ret = fmc_set_mode(fmdev, FM_MODE_TX); 446 - if (ret != 0) { 447 - fmerr("Failed to set TX mode\n"); 448 - return ret; 449 - } 450 - } 451 - 452 - aud_mode = (mod->txsubchans & V4L2_TUNER_SUB_STEREO) ? 453 - FM_STEREO_MODE : FM_MONO_MODE; 454 - rds_mode = (mod->txsubchans & V4L2_TUNER_SUB_RDS) ? 455 - FM_RDS_ENABLE : FM_RDS_DISABLE; 456 - ret = fm_tx_set_stereo_mono(fmdev, aud_mode); 457 - if (ret < 0) { 458 - fmerr("Failed to set mono/stereo mode for TX\n"); 459 - return ret; 460 - } 461 - ret = fm_tx_set_rds_mode(fmdev, rds_mode); 462 - if (ret < 0) 463 - fmerr("Failed to set rds mode for TX\n"); 464 - 465 - return ret; 466 - } 467 - 468 - static const struct v4l2_file_operations fm_drv_fops = { 469 - .owner = THIS_MODULE, 470 - .read = fm_v4l2_fops_read, 471 - .write = fm_v4l2_fops_write, 472 - .poll = fm_v4l2_fops_poll, 473 - .unlocked_ioctl = video_ioctl2, 474 - .open = fm_v4l2_fops_open, 475 - .release = fm_v4l2_fops_release, 476 - }; 477 - 478 - static const struct v4l2_ctrl_ops fm_ctrl_ops = { 479 - .s_ctrl = fm_v4l2_s_ctrl, 480 - .g_volatile_ctrl = fm_g_volatile_ctrl, 481 - }; 482 - static const struct v4l2_ioctl_ops fm_drv_ioctl_ops = { 483 - .vidioc_querycap = fm_v4l2_vidioc_querycap, 484 - .vidioc_g_audio = fm_v4l2_vidioc_g_audio, 485 - .vidioc_s_audio = fm_v4l2_vidioc_s_audio, 486 - .vidioc_g_tuner = fm_v4l2_vidioc_g_tuner, 487 - .vidioc_s_tuner = fm_v4l2_vidioc_s_tuner, 488 - .vidioc_g_frequency = fm_v4l2_vidioc_g_freq, 489 - .vidioc_s_frequency = fm_v4l2_vidioc_s_freq, 490 - .vidioc_s_hw_freq_seek = fm_v4l2_vidioc_s_hw_freq_seek, 491 - .vidioc_g_modulator = fm_v4l2_vidioc_g_modulator, 492 - .vidioc_s_modulator = fm_v4l2_vidioc_s_modulator 493 - }; 494 - 495 - /* V4L2 RADIO device parent structure */ 496 - static const struct video_device fm_viddev_template = { 497 - .fops = &fm_drv_fops, 498 - .ioctl_ops = &fm_drv_ioctl_ops, 499 - .name = FM_DRV_NAME, 500 - .release = video_device_release_empty, 501 - /* 502 - * To ensure both the tuner and modulator ioctls are accessible we 503 - * set the vfl_dir to M2M to indicate this. 504 - * 505 - * It is not really a mem2mem device of course, but it can both receive 506 - * and transmit using the same radio device. It's the only radio driver 507 - * that does this and it should really be split in two radio devices, 508 - * but that would affect applications using this driver. 509 - */ 510 - .vfl_dir = VFL_DIR_M2M, 511 - .device_caps = V4L2_CAP_HW_FREQ_SEEK | V4L2_CAP_TUNER | V4L2_CAP_RADIO | 512 - V4L2_CAP_MODULATOR | V4L2_CAP_AUDIO | 513 - V4L2_CAP_READWRITE | V4L2_CAP_RDS_CAPTURE, 514 - }; 515 - 516 - int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) 517 - { 518 - struct v4l2_ctrl *ctrl; 519 - int ret; 520 - 521 - strscpy(fmdev->v4l2_dev.name, FM_DRV_NAME, 522 - sizeof(fmdev->v4l2_dev.name)); 523 - ret = v4l2_device_register(NULL, &fmdev->v4l2_dev); 524 - if (ret < 0) 525 - return ret; 526 - 527 - /* Init mutex for core locking */ 528 - mutex_init(&fmdev->mutex); 529 - 530 - /* Setup FM driver's V4L2 properties */ 531 - gradio_dev = fm_viddev_template; 532 - 533 - video_set_drvdata(&gradio_dev, fmdev); 534 - 535 - gradio_dev.lock = &fmdev->mutex; 536 - gradio_dev.v4l2_dev = &fmdev->v4l2_dev; 537 - 538 - /* Register with V4L2 subsystem as RADIO device */ 539 - if (video_register_device(&gradio_dev, VFL_TYPE_RADIO, radio_nr)) { 540 - v4l2_device_unregister(&fmdev->v4l2_dev); 541 - fmerr("Could not register video device\n"); 542 - return -ENOMEM; 543 - } 544 - 545 - fmdev->radio_dev = &gradio_dev; 546 - 547 - /* Register to v4l2 ctrl handler framework */ 548 - fmdev->radio_dev->ctrl_handler = &fmdev->ctrl_handler; 549 - 550 - ret = v4l2_ctrl_handler_init(&fmdev->ctrl_handler, 5); 551 - if (ret < 0) { 552 - fmerr("(fmdev): Can't init ctrl handler\n"); 553 - v4l2_ctrl_handler_free(&fmdev->ctrl_handler); 554 - video_unregister_device(fmdev->radio_dev); 555 - v4l2_device_unregister(&fmdev->v4l2_dev); 556 - return -EBUSY; 557 - } 558 - 559 - /* 560 - * Following controls are handled by V4L2 control framework. 561 - * Added in ascending ID order. 562 - */ 563 - v4l2_ctrl_new_std(&fmdev->ctrl_handler, &fm_ctrl_ops, 564 - V4L2_CID_AUDIO_VOLUME, FM_RX_VOLUME_MIN, 565 - FM_RX_VOLUME_MAX, 1, FM_RX_VOLUME_MAX); 566 - 567 - v4l2_ctrl_new_std(&fmdev->ctrl_handler, &fm_ctrl_ops, 568 - V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1); 569 - 570 - v4l2_ctrl_new_std_menu(&fmdev->ctrl_handler, &fm_ctrl_ops, 571 - V4L2_CID_TUNE_PREEMPHASIS, V4L2_PREEMPHASIS_75_uS, 572 - 0, V4L2_PREEMPHASIS_75_uS); 573 - 574 - v4l2_ctrl_new_std(&fmdev->ctrl_handler, &fm_ctrl_ops, 575 - V4L2_CID_TUNE_POWER_LEVEL, FM_PWR_LVL_LOW, 576 - FM_PWR_LVL_HIGH, 1, FM_PWR_LVL_HIGH); 577 - 578 - ctrl = v4l2_ctrl_new_std(&fmdev->ctrl_handler, &fm_ctrl_ops, 579 - V4L2_CID_TUNE_ANTENNA_CAPACITOR, 0, 580 - 255, 1, 255); 581 - 582 - if (ctrl) 583 - ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE; 584 - 585 - return 0; 586 - } 587 - 588 - void *fm_v4l2_deinit_video_device(void) 589 - { 590 - struct fmdev *fmdev; 591 - 592 - 593 - fmdev = video_get_drvdata(&gradio_dev); 594 - 595 - /* Unregister to v4l2 ctrl handler framework*/ 596 - v4l2_ctrl_handler_free(&fmdev->ctrl_handler); 597 - 598 - /* Unregister RADIO device from V4L2 subsystem */ 599 - video_unregister_device(&gradio_dev); 600 - 601 - v4l2_device_unregister(&fmdev->v4l2_dev); 602 - 603 - return fmdev; 604 - }
-20
drivers/media/radio/wl128x/fmdrv_v4l2.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-only */ 2 - /* 3 - * FM Driver for Connectivity chip of Texas Instruments. 4 - * 5 - * FM V4L2 module header. 6 - * 7 - * Copyright (C) 2011 Texas Instruments 8 - */ 9 - 10 - #ifndef _FMDRV_V4L2_H 11 - #define _FMDRV_V4L2_H 12 - 13 - #include <media/v4l2-ioctl.h> 14 - #include <media/v4l2-common.h> 15 - #include <media/v4l2-ctrls.h> 16 - 17 - int fm_v4l2_init_video_device(struct fmdev *, int); 18 - void *fm_v4l2_deinit_video_device(void); 19 - 20 - #endif