2 * FM Driver for Connectivity chip of Broadcom Corporation.
4 * This sub-module of FM driver is common for FM RX and TX
5 * functionality. This module is responsible for:
6 * 1) Forming group of Channel-8 commands to perform particular
7 * functionality (eg., frequency set require more than
8 * one Channel-8 command to be sent to the chip).
9 * 2) Sending each Channel-8 command to the chip and reading
10 * response back over Shared Transport.
11 * 3) Managing TX and RX Queues and Tasklets.
12 * 4) Handling FM Interrupt packet and taking appropriate action.
14 * Copyright (C) 2009 Texas Instruments
15 * Copyright (C) 2009-2014 Broadcom Corporation
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
26 * You should have received a copy of the GNU General Public License
27 * along with this program; if not, write to the Free Software
28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 /************************************************************************************
33 * Filename: fmdrv_main.c
35 * Description: Common sub-module for both FM Rx and Tx. Currently, only
38 ***********************************************************************************/
40 #include <linux/module.h>
41 #include <linux/delay.h>
43 #include "fmdrv_v4l2.h"
44 #include "fmdrv_main.h"
45 #include "../../../bluetooth/hci_uart_bcm.h"
47 #include <linux/fm_public.h>
48 #define FMDRV_REGION_CONFIGS
49 #include "fmdrv_config.h"
54 #define pr_info(fmt, arg...)
58 /*******************************************************************************
60 *******************************************************************************/
64 static unsigned char default_radio_region; /* US */
65 module_param(default_radio_region, byte, 0);
66 MODULE_PARM_DESC(default_radio_region, "Region: 0=US, 1=Europe, 2=Japan");
68 /* RDS buffer blocks */
69 static unsigned int default_rds_buf = 300;
70 module_param(default_rds_buf, uint, 0444);
71 MODULE_PARM_DESC(rds_buf, "RDS buffer entries");
74 static int radio_nr = -1;
75 module_param(radio_nr, int, 0);
76 MODULE_PARM_DESC(radio_nr, "Radio Nr");
77 #if (defined CONFIG_BCM_BT_LPM && defined CONFIG_TIZEN_WIP)
78 extern struct notifier_block hci_event_nblock;
81 /*******************************************************************************
82 ** Forward function declarations
83 *******************************************************************************/
85 long (*g_bcm_write) (struct sk_buff *skb);
87 int parse_inrpt_flags(struct fmdrv_ops *fmdev);
88 int parse_rds_data(struct fmdrv_ops *fmdev);
89 void send_read_intrp_cmd(struct fmdrv_ops *fmdev);
90 int read_rds_data(struct fmdrv_ops *);
92 unsigned short global_frequency=8750;
93 unsigned char global_cur_rssi=0x6C; //-105dBm default
94 unsigned char global_VSE_subevent=0;
96 /*******************************************************************************
98 *******************************************************************************/
100 //#ifdef FM_DUMP_TXRX_PKT
101 /* To dump outgoing FM Channel-8 packets */
102 inline void dump_tx_skb_data(struct sk_buff *skb)
106 struct fm_cmd_msg_hdr_sprd *cmd_hdr;
108 cmd_hdr = (struct fm_cmd_msg_hdr_sprd *)skb->data;
109 printk(KERN_INFO "<<%shdr:%02x len:%02x opcode:%02x",
110 fm_cb(skb)->completion ? " " : "*", cmd_hdr->header,
111 cmd_hdr->len, cmd_hdr->fm_opcode);
113 len_org = skb->len - FM_CMD_MSG_HDR_SIZE_SPRD;
116 //printk("\n data(%d): ", cmd_hdr->dlen);
117 len = min(len_org, 14);
118 for (index = 0; index < len; index++)
120 skb->data[FM_CMD_MSG_HDR_SIZE_SPRD + index]);
121 printk("%s", (len_org > 14) ? ".." : "");
126 /* To dump incoming FM Channel-8 packets */
127 inline void dump_rx_skb_data(struct sk_buff *skb)
131 struct fm_event_msg_hdr *evt_hdr;
133 evt_hdr = (struct fm_event_msg_hdr *)skb->data;
134 printk(KERN_INFO ">> header:%02x event:%02x len:%02x",
135 evt_hdr->header, evt_hdr->event_id, evt_hdr->len);
137 len_org = skb->len - FM_EVT_MSG_HDR_SIZE;
140 printk("\n data(%d): ", evt_hdr->len);
141 len = min(len_org, 14);
142 for (index = 0; index < len; index++)
144 skb->data[FM_EVT_MSG_HDR_SIZE + index]);
145 printk("%s", (len_org > 14) ? ".." : "");
153 * Store the currently set region
155 void fmc_update_region_info(struct fmdrv_ops *fmdev,
156 unsigned char region_to_set)
158 fmdev->rx.curr_region = region_to_set;
159 memcpy(&fmdev->rx.region, ®ion_configs[region_to_set],
160 sizeof(struct region_info));
161 fmdev->rx.curr_freq = fmdev->rx.region.low_bound;
162 fm_rx_config_deemphasis( fmdev,fmdev->rx.region.deemphasis);
166 * FM common sub-module will schedule this tasklet whenever it receives
167 * FM packet from ST driver.
169 static void __recv_tasklet(unsigned long arg)
171 struct fmdrv_ops *fmdev;
172 struct fm_event_msg_hdr *fm_evt_hdr;
175 unsigned char sub_event, *p;
176 unsigned char rdsdata_len=0;
177 unsigned char tmpbuf[64]={0};
178 unsigned char ps,rds_type;
181 fmdev = (struct fmdrv_ops *)arg;
183 pr_err("wsh___recv_tasklet");
184 /* Process all packets in the RX queue */
185 while ((skb = skb_dequeue(&fmdev->rx_q)))
187 if (skb->len < sizeof(struct fm_event_msg_hdr))
189 pr_err("(fmdrv): skb(%p) has only %d bytes"
190 "atleast need %lu bytes to decode\n",
192 (unsigned long)sizeof(struct fm_event_msg_hdr));
196 //#ifdef FM_DUMP_TXRX_PKT
197 dump_rx_skb_data(skb);
199 fm_evt_hdr = (void *)skb->data;
200 pr_err("\neventid=%02x ,last_sent_pkt_opcode=%02x \n",fm_evt_hdr->event_id,fmdev->last_sent_pkt_opcode);
202 if(fmdev->response_completion != NULL){
204 pr_info("response_completion have completion\n");
207 if (fm_evt_hdr->event_id == HCI_EV_CMD_COMPLETE)
209 struct fm_cmd_complete_hdr_sprd *cmd_complete_hdr;
210 cmd_complete_hdr = (struct fm_cmd_complete_hdr_sprd *) &skb->data [FM_EVT_MSG_HDR_SIZE];
211 pr_err("the header is : %2x \n",cmd_complete_hdr->fm_opcode);
212 /* Anyone waiting for this with completion handler? */
213 if (/*cmd_complete_hdr->fm_opcode == fmdev->last_sent_pkt_opcode && */
214 fmdev->response_completion != NULL)
216 pr_info("(fmdrv) %s() : Command complete Event\n", __func__);
217 if (fmdev->response_skb != NULL)
218 pr_err("(fmdrv) %s(): Response SKB ptr not NULL\n", __func__);
220 if(cmd_complete_hdr->fm_opcode == FM_REG_FM_RDS_MSK)
221 fmdev->rx.fm_rds_flag &= ~FM_RDS_FLAG_SCH_FRZ_BIT;
223 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
224 fmdev->response_skb = skb;
225 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
226 complete(fmdev->response_completion);
228 fmdev->response_completion = NULL;
229 atomic_set(&fmdev->tx_cnt, 1);
232 /* This is the VSE interrupt handler case */
234 else if (fm_evt_hdr->event_id == 0xFF)
237 pr_info("(fmdrv) %s : VSE interrupt handler case\n", __func__);
238 if (fmdev->response_skb != NULL)
239 pr_err("(fmdrv) %s(): Response SKB ptr not NULL\n", __func__);
240 p = &skb->data[FM_EVT_MSG_HDR_SIZE];
242 STREAM_TO_UINT8(sub_event, p);
243 //sub_event=0x30,p=0x0,p+1=0xae,p+2=0x0.p:after subevent
244 pr_info("sub_event=0x%x,p=0x%x,p+1=0x%x,p+2=0x%x",sub_event,p[0],p[1],p[2]);
246 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
247 fmdev->response_skb = skb;
248 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
252 complete(&fmdev->seektask_completion);
254 //(&fmdev->seektask_completion)= NULL;
256 global_frequency=(p[4]<<8)+p[3];
257 global_VSE_subevent =sub_event;
258 global_cur_rssi=p[1];
259 /* fmdev->rx.curr_rssi_threshold=p[1]; */
260 pr_info("seek freq is %d\n",global_frequency);
261 atomic_set(&fmdev->tx_cnt, 1);}
262 else if(sub_event==0x31)
264 pr_info("This is AF jump event\n");
268 pr_info("This is RDS data event from controller\n");
274 pr_info("RDS data before memcopy,rdsdata_len=%x\n",rdsdata_len);
275 fmdev->rx.rds.rd_index=900; //when before read, default value
276 memcpy(&fmdev->rx.rds.cbuffer[0], p,rdsdata_len+1);
277 fmdev->rx.rds.wr_index=rdsdata_len+1;
278 fmdev->rx.rds.buf_size=rdsdata_len+1;
280 if (fmdev->rx.rds.wr_index != fmdev->rx.rds.rd_index)
281 pr_info("after memcopy\n");
282 for(i=0;i<rdsdata_len+1;i++)
284 pr_info("p[%d]=%x__",i,p[i]);
287 wake_up_interruptible(&fmdev->rx.rds.read_queue);
292 { pr_info("ps data before memcopy,rdsdata_len=%x\n",rdsdata_len);
293 fmdev->rx.rds.rd_index=900; //when before read, default value
294 memcpy(&fmdev->rx.rds.cbuffer[0], p,rdsdata_len+1);
295 fmdev->rx.rds.wr_index=rdsdata_len+1;
296 fmdev->rx.rds.buf_size=rdsdata_len+1;
298 if (fmdev->rx.rds.wr_index != fmdev->rx.rds.rd_index)
299 pr_info("after memcopy\n");
300 for(i=0;i<rdsdata_len+1;i++)
302 pr_info("p[%d]=%x__",i,p[i]);
304 wake_up_interruptible(&fmdev->rx.rds.read_queue);
309 pr_info("RT data comming");
310 fmdev->rx.rds.rd_index=900; //when before read, default value
311 memcpy(&fmdev->rx.rds.cbuffer[0], p,rdsdata_len+1);
312 fmdev->rx.rds.wr_index=rdsdata_len+1;
313 fmdev->rx.rds.buf_size=rdsdata_len+1;
315 if (fmdev->rx.rds.wr_index != fmdev->rx.rds.rd_index)
316 pr_info("after memcopy\n");
317 for(i=0;i<rdsdata_len+1;i++)
319 pr_info("p[%d]=%x__",i,p[i]);
321 wake_up_interruptible(&fmdev->rx.rds.read_queue);
332 // else if(fm_evt_hdr->event_id == BRCM_FM_VS_EVENT) /* Vendor specific Event */
333 else if(fm_evt_hdr->event_id ==0xFE)
335 p = &skb->data[FM_EVT_MSG_HDR_SIZE];
337 /* Check if this is a FM vendor specific event */
338 STREAM_TO_UINT8(sub_event, p);
339 if(sub_event == BRCM_VSE_SUBCODE_FM_INTERRUPT)
341 pr_info("(fmdrv) %s(): VSE Interrupt event for FM received\n",
343 pr_info("(fmdrv) %s(): Calling fmc_send_intrp_cmd()\n",
345 send_read_intrp_cmd(fmdev);
350 pr_err("(fmdrv) %s(): Unhandled packet SKB(%p),purging\n", __func__, skb);
352 if (!skb_queue_empty(&fmdev->tx_q))
353 tasklet_schedule(&fmdev->tx_task);
358 * FM send tasklet: is scheduled when
359 * FM packet has to be sent to chip */
360 static void __send_tasklet(unsigned long arg)
362 struct fmdrv_ops *fmdev;
366 fmdev = (struct fmdrv_ops *)arg;
367 /* Send queued FM TX packets */
368 if (atomic_read(&fmdev->tx_cnt))
370 skb = skb_dequeue(&fmdev->tx_q);
373 atomic_dec(&fmdev->tx_cnt);
374 fmdev->last_sent_pkt_opcode = fm_cb(skb)->fm_opcode;
376 if (fmdev->response_completion != NULL)
377 pr_err("(fmdrv) %s(): Response completion handler is not NULL\n",
380 fmdev->response_completion = fm_cb(skb)->completion;
381 pr_info("(fmdrv): %s(): *** pkt_type 0x%x\n",
382 __func__, sh_ldisc_cb(skb)->pkt_type);
383 /* SYED : Hack to set the right packet type for FM */
384 sh_ldisc_cb(skb)->pkt_type = FM_PKT_LOGICAL_CHAN_NUMBER;
385 /* Write FM packet to hci shared ldisc driver */
386 len = g_bcm_write(skb);
389 pr_err("(fmdrv): %s(): TX tasklet failed to send skb(0x%p)\n",
392 fmdev->response_completion = NULL;
393 atomic_set(&fmdev->tx_cnt, 1);
396 fmdev->last_tx_jiffies = jiffies;
402 /* Queues FM Channel-8 packet to FM TX queue and schedules FM TX tasklet for
404 static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index,
405 void *payload, int payload_len, unsigned char type,
406 struct completion *wait_completion)
409 struct fm_cmd_msg_hdr_sprd *cmd_hdr;
411 #if (defined CONFIG_BCM_BT_LPM && defined CONFIG_TIZEN_WIP)
412 hci_event_nblock.notifier_call(NULL,HCI_DEV_WRITE,NULL);
415 size = FM_CMD_MSG_HDR_SIZE_SPRD + ((payload == NULL) ? 0 : payload_len);
417 skb = alloc_skb(size, GFP_ATOMIC);
420 pr_err("(fmdrv): %s(): No memory to create new SKB\n",
425 /* Fill command header info */
426 cmd_hdr =(struct fm_cmd_msg_hdr_sprd *)skb_put(skb, FM_CMD_MSG_HDR_SIZE_SPRD);
428 /* kilsung Change for 4343S */
429 cmd_hdr->header = 0x01; /* FM_PKT_LOGICAL_CHAN_NUMBER;*/ /* 0x08 */
430 /* 3 (cmd, len, fm_opcode,rd_wr) */
431 cmd_hdr->cmd = hci_opcode_pack(HCI_GRP_VENDOR_SPECIFIC, FM_SPRD_OP_CODE);
433 cmd_hdr->len = ((payload == NULL) ? 0 : payload_len) + 1; //need to check
435 cmd_hdr->fm_opcode = fmreg_index;
436 /* read/write type */
437 // cmd_hdr->rd_wr = type;
439 fm_cb(skb)->fm_opcode = fmreg_index;
442 memcpy(skb_put(skb, payload_len), payload, payload_len);
444 fm_cb(skb)->completion = wait_completion;
445 skb_queue_tail(&fmdev->tx_q, skb);
446 tasklet_schedule(&fmdev->tx_task);
452 /* Sends FM Channel-8 command to the chip and waits for the reponse */
453 int fmc_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index,
454 void *payload, int payload_len, unsigned char type,
455 struct completion *wait_completion, void *reponse,
459 struct fm_event_msg_hdr *fm_evt_hdr;
460 struct fm_cmd_complete_hdr_sprd *cmd_complete_hdr;
461 unsigned long timeleft;
465 mutex_lock(&fmdev->completionmutex);
466 init_completion(wait_completion);
467 ret = __fm_send_cmd(fmdev, fmreg_index, payload, payload_len, type,
472 timeleft = wait_for_completion_timeout(wait_completion, FM_DRV_TX_TIMEOUT);
475 pr_err("(fmdrv) %s(): Timeout(%d sec),didn't get reg 0x%02X "
476 "completion signal from RX tasklet\n",
477 __func__, jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000, fmreg_index);
478 mutex_unlock(&fmdev->completionmutex);
481 mutex_unlock(&fmdev->completionmutex);
482 if (!fmdev->response_skb) {
483 pr_err("(fmdrv) %s(): Reponse SKB is missing for 0x%02X\n", __func__, fmreg_index);
486 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
487 skb = fmdev->response_skb;
488 fmdev->response_skb = NULL;
489 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
491 fm_evt_hdr = (void *)skb->data;
492 if (fm_evt_hdr->event_id == HCI_EV_CMD_COMPLETE) /* Vendor specific command response */
494 cmd_complete_hdr = (struct fm_cmd_complete_hdr_sprd *) &skb->data [FM_EVT_MSG_HDR_SIZE];
495 if (cmd_complete_hdr->status != 0)
497 pr_err("(fmdrv) %s(): Reponse status not success for 0x%02X\n",
498 __func__, fmreg_index);
503 pr_info("(fmdrv) %s(): Reponse status success for 0x%02X: %d,head_len=%d\n",
504 __func__, fmreg_index, cmd_complete_hdr->status,fm_evt_hdr->len);
505 /* Send reponse data to caller */
506 if (reponse != NULL && reponse_len != NULL && fm_evt_hdr->len) {
507 /* Skip header info and copy only response data */
508 pr_info("weisonghe\n");
510 skb_pull(skb, (FM_EVT_MSG_HDR_SIZE + 4));//data after status
511 memcpy(reponse, skb->data, (fm_evt_hdr->len-4) );
512 *reponse_len = (fm_evt_hdr->len - 4) ;//len -4 =after status
513 // debugbuf=(unsigned char *)reponse;
514 // pr_info("reponse=%x\n",debugbuf[0]);
517 else if (reponse_len != NULL && fm_evt_hdr->len == 0) {
523 pr_err("(fmdrv) %s(): Unhandled event ID for 0x%02X: %d\n",
524 __func__, fmreg_index, fm_evt_hdr->event_id);
530 /* Helper function to parse the interrupt bits
531 * in FM_REG_FM_RDS_FLAG (0x12).
532 * Called locally by fmdrv_main.c
534 int parse_inrpt_flags(struct fmdrv_ops *fmdev)
538 unsigned short fm_rds_flag;
539 unsigned char response[2];
542 pr_info("(fmdrv) %s()\n", __func__);
545 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
546 skb = fmdev->response_skb;
547 fmdev->response_skb = NULL;
548 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
550 memcpy(&response, &skb->data[FM_EVT_MSG_HDR_SIZE + FM_CMD_COMPLETE_HDR_SIZE_sprd], 2);
551 fm_rds_flag= (unsigned short)response[0] + ((unsigned short)response[1] << 8) ;
553 if (fmdev->rx.fm_rds_flag & (FM_RDS_FLAG_SCH_FRZ_BIT|FM_RDS_FLAG_CLEAN_BIT))
555 fmdev->rx.fm_rds_flag &= ~FM_RDS_FLAG_CLEAN_BIT;
556 pr_info("(fmdrv) %s(): Clean BIT set. So no processing of the current\
557 FM/RDS flag set\n", __func__);
562 pr_info("(fmdrv) %s(): Processing the interrupt flag. Flag read is 0x%x 0x%x\n",
563 __func__, response[0], response[1]);
565 pr_info("(fmdrv) %s(): flag register(0x%x)\n", __func__, fm_rds_flag);
567 if(fm_rds_flag & (I2C_MASK_SRH_TUNE_CMPL_BIT|I2C_MASK_SRH_TUNE_FAIL_BIT))
569 /* remove sch_tune pending bit */
570 fmdev->rx.fm_rds_flag &= ~FM_RDS_FLAG_SCH_BIT;
572 if(fm_rds_flag & I2C_MASK_SRH_TUNE_FAIL_BIT)
574 pr_err("(fmdrv) %s(): MASK BIT : Search failure\n", __func__);
575 if(fmdev->rx.curr_search_state == FM_STATE_SEEKING)
577 fmdev->rx.curr_search_state = FM_STATE_SEEK_ERR;
578 complete(&fmdev->seektask_completion);
580 else if(fmdev->rx.curr_search_state == FM_STATE_TUNING)
582 fmdev->rx.curr_search_state = FM_STATE_TUNE_ERR;
583 complete(&fmdev->maintask_completion);
588 pr_info("(fmdrv) %s(): MASK BIT : Search success\n", __func__);
589 if(fmdev->rx.curr_search_state == FM_STATE_SEEKING)
591 fmdev->rx.curr_search_state = FM_STATE_SEEK_CMPL;
592 complete(&fmdev->seektask_completion);
594 else if(fmdev->rx.curr_search_state == FM_STATE_TUNING)
596 fmdev->rx.curr_search_state = FM_STATE_TUNE_CMPL;
597 complete(&fmdev->maintask_completion);
601 else if(fm_rds_flag & I2C_MASK_RDS_FIFO_WLINE_BIT)
603 pr_info("(fmdrv) %s(): Detected WLINE interrupt; Reading RDS.\n",
605 read_rds_data(fmdev);
613 read RDS data from sock buffer to fmdev cbuff
614 called by __recv_tasklet interace
617 int parse_rds_data(struct fmdrv_ops *fmdev)
619 unsigned char *rds_data;
621 unsigned char ps_buffer[1];
622 unsigned char RT_buffer[64];
623 unsigned char RDS_type;
624 struct sk_buffer *skb;
625 int ret, response_len, index=0;
627 pr_info("(fm_rds) %s\n", __func__);
629 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
630 skb = fmdev->response_skb;
631 fmdev->response_skb = NULL;
632 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
633 // skb_pull(skb, (sizeof(struct fm_event_msg_hdr) + sizeof(struct fm_cmd_complete_hdr)));
634 rds_data = skb->data;
635 response_len = skb->len;
637 pr_info("(fm_rds) RDS length : %d, RDS_data=%x\n", response_len,rds_data[0]);
648 /* Helper function to parse the RDS data
649 * in FM_REG_FM_RDS_DATA (0x80).
650 * Called locally by fmdrv_main.c
652 int brm_parse_rds_data(struct fmdrv_ops *fmdev)
655 unsigned char *rds_data, tmpbuf[3];
656 unsigned char type, block_index;
657 tBRCM_RDS_QUALITY qlty_index;
658 int ret, response_len, index=0;
660 //struct fm_event_msg_hdr *fm_evt_hdr;
661 //struct fm_cmd_complete_hdr *cmd_complete_hdr;
664 pr_info("(fm_rds) %s\n", __func__);
667 spin_lock_irqsave(&fmdev->resp_skb_lock, flags);
668 skb = fmdev->response_skb;
669 fmdev->response_skb = NULL;
670 spin_unlock_irqrestore(&fmdev->resp_skb_lock, flags);
671 skb_pull(skb, (sizeof(struct fm_event_msg_hdr) + sizeof(struct fm_cmd_complete_hdr)));
672 rds_data = skb->data;
673 response_len = skb->len;
675 pr_info("(fm_rds) RDS length : %d\n", response_len);
679 spin_lock_irqsave(&fmdev->rds_cbuff_lock, flags);
680 while (response_len > 0)
682 /* Fill RDS buffer as per V4L2 specification.
686 type = (rds_data[0] & BRCM_RDS_GRP_TYPE_MASK);
687 block_index = (type >> 4);
688 if (block_index < V4L2_RDS_BLOCK_A|| block_index > V4L2_RDS_BLOCK_C_ALT)
690 pr_err("(fm_rds) Block sequence mismatch\n");
691 block_index = V4L2_RDS_BLOCK_INVALID;
694 qlty_index = (tBRCM_RDS_QUALITY)((rds_data[0] & BRCM_RDS_GRP_QLTY_MASK) >> 2);
696 tmpbuf[2] = (block_index & V4L2_RDS_BLOCK_MSK); /* Offset name */
697 tmpbuf[2] |= ((block_index & V4L2_RDS_BLOCK_MSK) << 3); /* Reserved offset */
701 case BRCM_RDS_NO_ERR:
702 /* Set bits 7 and 8 to 0 to indicate no error / correction*/
704 pr_info("(fm_rds) qlty : BRCM_RDS_NO_ERR\n");
706 //tmpbuf[2] &= ~(BRCM_RDS_BIT_6 | BRCM_RDS_BIT_7);
710 case BRCM_RDS_2BIT_ERR:
711 case BRCM_RDS_3BIT_ERR:
713 pr_info("(fm_rds) qlty : %s\n", ((qlty_index==BRCM_RDS_2BIT_ERR)?
714 "BRCM_RDS_2BIT_ERR":"BRCM_RDS_3BIT_ERR"));
716 /* Set bit 7 to 1 and bit 8 to 0 indicate no error
717 but correction made*/
718 tmpbuf[2] |= (BRCM_RDS_BIT_6);
719 tmpbuf[2] &= ~(BRCM_RDS_BIT_7);
722 case BRCM_RDS_UNRECOVER:
723 pr_info("(fm_rds) qlty : BRCM_RDS_UNRECOVER for data [ 0x%x 0x%x 0x%x]\n",
724 rds_data[0], rds_data[1], rds_data[2]);
725 /* Set bit 7 to 0 and bit 8 to 1 indicate error */
726 tmpbuf[2] |= (BRCM_RDS_BIT_7);
727 tmpbuf[2] &= ~(BRCM_RDS_BIT_6);
730 pr_err("(fm_rds) Unknown quality code\n");
731 tmpbuf[2] |= (BRCM_RDS_BIT_7);
732 tmpbuf[2] &= ~(BRCM_RDS_BIT_6);
736 /* Store data byte. Swap bytes*/
737 tmpbuf[0] = rds_data[2]; /* LSB of V4L2 spec block */
738 tmpbuf[1] = rds_data[1]; /* MSB of V4L2 spec block */
740 pr_info("(fm_rds) Copying [ 0x%x 0x%x 0x%x] as [0x%x 0x%x 0x%x] to V4L2\n",
741 rds_data[0], rds_data[1], rds_data[2],
742 tmpbuf[0], tmpbuf[1], tmpbuf[2]);
744 memcpy(&fmdev->rx.rds.cbuffer[fmdev->rx.rds.wr_index], &tmpbuf,
745 FM_RDS_TUPLE_LENGTH);
746 fmdev->rx.rds.wr_index =
747 (fmdev->rx.rds.wr_index +
748 FM_RDS_TUPLE_LENGTH) % fmdev->rx.rds.buf_size;
750 /* Check for overflow & start over */
751 if (fmdev->rx.rds.wr_index == fmdev->rx.rds.rd_index) {
752 pr_err("(fm_rds) RDS buffer overflow\n");
753 fmdev->rx.rds.wr_index = 0;
754 fmdev->rx.rds.rd_index = 0;
758 /*Check for end of RDS tuple */
759 if ((rds_data + FM_RDS_TUPLE_LENGTH)[FM_RDS_TUPLE_BYTE1] == FM_RDS_END_TUPLE_1ST_BYTE &&
760 (rds_data + FM_RDS_TUPLE_LENGTH)[FM_RDS_TUPLE_BYTE2] == FM_RDS_END_TUPLE_2ND_BYTE &&
761 (rds_data + FM_RDS_TUPLE_LENGTH)[FM_RDS_TUPLE_BYTE3] == FM_RDS_END_TUPLE_3RD_BYTE )
763 pr_err("(fm_rds) End of RDS tuple reached @ %d index\n", index);
766 response_len -= FM_RDS_TUPLE_LENGTH;
767 rds_data += FM_RDS_TUPLE_LENGTH;
768 index += FM_RDS_TUPLE_LENGTH;
770 spin_unlock_irqrestore(&fmdev->rds_cbuff_lock, flags);
772 /* Set Tuner RDS capability bit as RDS data has been detected */
773 fmdev->device_info.rxsubchans |= V4L2_TUNER_SUB_RDS;
775 /* Wakeup read queue */
776 if (fmdev->rx.rds.wr_index != fmdev->rx.rds.rd_index)
777 wake_up_interruptible(&fmdev->rx.rds.read_queue);
780 pr_info("(fm_rds) Now reset the mask\n");
782 fmdev->rx.fm_rds_mask |= I2C_MASK_RDS_FIFO_WLINE_BIT;
784 ret = __fm_send_cmd(fmdev, FM_REG_FM_RDS_MSK, &fmdev->rx.fm_rds_mask,
787 pr_info("(fm_rds) %s(): Write to FM_REG_FM_RDS_MSK done : %d\n",
795 * Read the FM_REG_FM_RDS_FLAG by sending a read command.
796 * Called locally by fmdrv_main.c
798 void send_read_intrp_cmd(struct fmdrv_ops *fmdev)
800 unsigned char read_length;
803 read_length = FM_READ_2_BYTE_DATA;
804 ret = __fm_send_cmd(fmdev, FM_REG_FM_RDS_FLAG, &read_length,
805 sizeof(read_length), REG_RD, NULL);
808 pr_err("(fmdrv) %s(): Error reading FM_REG_FM_RDS_FLAG\n", __func__);
810 pr_info("(fmdrv) %s(): Sent read to Interrupt flag FM_REG_FM_RDS_FLAG\n",
814 /* Initiate a read to RDS register. Called locally by fmdrv_main.c */
815 int read_rds_data(struct fmdrv_ops *fmdev)
817 unsigned char payload;
820 payload = FM_RDS_FIFO_MAX;
822 pr_info("(fmdrv) %s(): Going to read RDS data from FM_REG_RDS_DATA!!\n",
825 ret = __fm_send_cmd(fmdev, FM_SETRDSMODE_SUB_CMD, &payload, 1, REG_RD, NULL);
830 * Function to copy RDS data from the FM ring buffer
831 * to the userspace buffer.
833 int fmc_transfer_rds_from_cbuff(struct fmdrv_ops *fmdev, struct file *file,
834 char __user * buf, size_t count)
836 unsigned int block_count;
840 /* Block if no new data available */
841 if (fmdev->rx.rds.wr_index == fmdev->rx.rds.rd_index) {
842 if (file->f_flags & O_NONBLOCK)
845 ret = wait_event_interruptible(fmdev->rx.rds.read_queue,
846 (fmdev->rx.rds.wr_index != fmdev->rx.rds.rd_index));
848 pr_err("(fm_rds) %s(): Error : EINTR\n", __func__);
852 /* Calculate block count from byte count */
854 spin_lock_irqsave(&fmdev->rds_cbuff_lock, flags);
855 copy_to_user(buf, &fmdev->rx.rds.cbuffer[0],fmdev->rx.rds.buf_size);
857 //fmdev->rx.rds.wr_index=0;
858 fmdev->rx.rds.rd_index=fmdev->rx.rds.buf_size;
863 /* Copy RDS blocks from the internal buffer and to user buffer */
864 while (block_count < count) {
865 if (fmdev->rx.rds.wr_index == fmdev->rx.rds.rd_index)
868 /* Always transfer complete RDS blocks */
870 (buf, &fmdev->rx.rds.cbuffer[fmdev->rx.rds.rd_index],
871 fmdev->rx.rds.buf_size))
874 /* Increment and wrap the read pointer */
875 fmdev->rx.rds.rd_index += FM_RDS_BLOCK_SIZE;
877 /* Wrap read pointer */
878 if (fmdev->rx.rds.rd_index >= fmdev->rx.rds.buf_size)
879 fmdev->rx.rds.rd_index = 0;
881 /* Increment counters */
883 buf += FM_RDS_BLOCK_SIZE;
884 ret += FM_RDS_BLOCK_SIZE;
888 spin_unlock_irqrestore(&fmdev->rds_cbuff_lock, flags);
890 pr_info("(fm_rds) %s(): Done copying %d,wr_index=%d,rd_index=%d\n", __func__, fmdev->rx.rds.buf_size,fmdev->rx.rds.wr_index,fmdev->rx.rds.rd_index);
892 return fmdev->rx.rds.buf_size;
895 /* Sets the frequency */
896 int fmc_set_frequency(struct fmdrv_ops *fmdev, unsigned int freq_to_set)
900 switch (fmdev->curr_fmmode) {
902 ret = fm_rx_set_frequency(fmdev, freq_to_set);
906 /* Currently FM TX is not supported */
914 /* Returns the current tuned frequency */
915 int fmc_get_frequency(struct fmdrv_ops *fmdev, unsigned int *cur_tuned_frq)
919 switch (fmdev->curr_fmmode) {
921 ret = fm_rx_get_frequency(fmdev, cur_tuned_frq);
925 /* Currently FM TX is not supported */
933 /* Function to initiate SEEK operation */
934 int fmc_seek_station(struct fmdrv_ops *fmdev, unsigned char direction_upward,
935 unsigned char wrap_around)
937 return fm_rx_seek_station(fmdev, direction_upward, wrap_around);
940 /* Returns current band index (0-Europe/US; 1-Japan) */
941 int fmc_get_region(struct fmdrv_ops *fmdev, unsigned char *region)
943 *region = fmdev->rx.curr_region;
947 /* Set the world region */
948 int fmc_set_region(struct fmdrv_ops *fmdev, unsigned char region_to_set)
952 switch (fmdev->curr_fmmode) {
954 if (region_to_set == fmdev->rx.curr_region)
956 pr_info("(fmdrv) %s(): Already region is set(%d)\n",
957 __func__, region_to_set);
960 ret = fm_rx_set_region(fmdev, region_to_set);
964 /* Currently FM TX is not supported */
972 /* Sets the audio mode */
973 int fmc_set_audio_mode(struct fmdrv_ops *fmdev, unsigned char audio_mode)
977 switch (fmdev->curr_fmmode) {
979 ret = fm_rx_set_audio_mode(fmdev, audio_mode);
983 /* Currently FM TX is not supported */
991 /* Sets the scan step */
992 int fmc_set_scan_step(struct fmdrv_ops *fmdev, unsigned char scan_step)
996 switch (fmdev->curr_fmmode) {
998 ret = fm_rx_set_scan_step(fmdev, scan_step);
1002 /* Currently FM TX is not supported */
1011 * Resets RDS cache parameters
1013 void fmc_reset_rds_cache(struct fmdrv_ops *fmdev)
1015 fmdev->rx.rds.rds_flag = FM_RDS_DISABLE;
1016 fmdev->rx.rds.wr_index = 0;
1017 fmdev->rx.rds.rd_index = 0;
1018 fmdev->device_info.rxsubchans &= ~V4L2_TUNER_SUB_RDS;
1022 * Turn FM ON by sending FM_ENABLE_SUB_CMD commmand
1024 int fmc_turn_fm_on (struct fmdrv_ops *fmdev, unsigned char rds_flag)
1027 //unsigned char payload; by wsh
1028 unsigned short payload;
1030 if (rds_flag != FM_RDS_ENABLE && rds_flag != FM_RDS_DISABLE) {
1031 pr_err("(fmdrv) %s(): Invalid rds option\n", __func__);
1035 if (fmdev->softmute_blend_config.start_mute == 0x1) {
1037 pr_info("(fmdrv) %s(): SOFT MUTE Enabled\n", __func__);
1041 pr_info("(fmdrv) %s(): SOFT MUTE Disabled start_mute = %d\n", __func__,fmdev->softmute_blend_config.start_mute);
1044 if (rds_flag == FM_RDS_ENABLE)
1045 payload = (FM_ON | FM_RDS_ON);
1049 ret = fmc_send_cmd(fmdev, FM_ENABLE_SUB_CMD, &payload, sizeof(payload),
1050 REG_WR, &fmdev->maintask_completion, NULL, NULL);
1051 FM_CHECK_SEND_CMD_STATUS(ret);
1053 pr_debug("(fmdrv) %s(): FM_ENABLE_SUB_CMD write done\n", __func__);
1055 fmdev->rx.rds.rds_flag = rds_flag;
1062 int fmc_turn_fm_off(struct fmdrv_ops *fmdev)
1065 unsigned char payload;
1066 #if 0 /* There is no chip side mute in sc2331 for FM*/
1068 payload = FM_MUTE_ON; /* darrel issue_02 : mute on is value 1 */
1069 ret = fm_rx_set_mute_mode(fmdev, payload);
1071 FM_CHECK_SEND_CMD_STATUS(ret);
1075 pr_err ("(fmdrv) %s(): FM mute off during FM Disable operation has failed\n",
1083 ret = fmc_send_cmd(fmdev, FM_DISABLE_SUB_CMD, &payload, sizeof(payload),
1084 REG_WR, &fmdev->maintask_completion, NULL, NULL);
1085 FM_CHECK_SEND_CMD_STATUS(ret);
1091 * Set FM Modes(TX, RX, OFF)
1092 * TX and RX modes are exclusive
1094 int fmc_set_mode(struct fmdrv_ops *fmdev, unsigned char fm_mode)
1098 if (fm_mode >= FM_MODE_ENTRY_MAX) {
1099 pr_err("(fmdrv) %s(): Invalid FM mode : %d\n", __func__, fm_mode);
1103 if (fmdev->curr_fmmode == fm_mode) {
1104 pr_info("(fmdrv) %s(): Already fm is in mode(%d)", __func__, fm_mode);
1107 fmdev->curr_fmmode = fm_mode;
1112 * Turn on FM, and other initialization to enable FM
1114 int fmc_enable (struct fmdrv_ops *fmdev, unsigned char opt)
1117 unsigned char rds_en_dis, rdbs_en_dis;
1118 unsigned char aud_ctrl;
1119 unsigned char read_length;
1120 unsigned char resp_buf [1];
1122 global_frequency=8750;
1124 if (!test_bit(FM_CORE_READY, &fmdev->flag))
1126 pr_err("(fmdrv) %s(): FM core is not ready\n", __func__);
1130 fmc_set_mode (fmdev, FM_MODE_RX);
1132 /*android:functionalityMask: bit4:RDS bit5:RBDS bit6:AF bit8:softmute default:352(5,6,8 bit=1)*/
1135 rds_en_dis = (opt & (FM_RDS_BIT | FM_RBDS_BIT)) ?
1136 FM_RDS_ENABLE : FM_RDS_DISABLE;
1138 ret = fmc_turn_fm_on (fmdev, rds_en_dis);
1142 pr_err ("(fmdrv) %s(): FM turn on failed\n", __func__);
1145 fmdev->rx.fm_func_mask = opt;
1146 /* wait for 50 ms before sending any more commands */
1149 /* wrire rds control */
1150 rdbs_en_dis = (opt & FM_RBDS_BIT) ?
1151 FM_RDBS_ENABLE : FM_RDBS_DISABLE;
1152 ret = fm_rx_set_rds_system (fmdev, rdbs_en_dis);
1156 pr_err ("(fmdrv) %s(): set rds mode failed\n", __func__);
1159 ret = fm_rx_set_region( fmdev,(opt & FM_REGION_MASK));
1163 pr_err ("(fmdrv) %s(): set region has failed\n", __func__);
1167 /* fmdev->rx.curr_rssi_threshold = DEF_V4L2_FM_SIGNAL_STRENGTH;*/
1169 /* Read PCM Route settings */
1171 /*********************don't need, beacause marlin auto check pcm, not depend on AP CMD ***
1173 read_length = FM_READ_1_BYTE_DATA;
1174 ret = fmc_send_cmd(fmdev, FM_REG_PCM_ROUTE, &read_length, sizeof(read_length), REG_RD,
1175 &fmdev->maintask_completion, &resp_buf, &resp_len);
1176 FM_CHECK_SEND_CMD_STATUS(ret);
1177 fmdev->rx.pcm_reg = resp_buf[0];
1178 pr_debug ("(fmdrv) %s(): pcm_reg value %d\n", __func__, fmdev->rx.pcm_reg);
1180 // darrel : fm enable with mute state. added FM_MANUAL_MUTE
1182 aud_ctrl = (unsigned short)(FM_AUDIO_DAC_ON | \
1183 FM_RF_MUTE | FM_Z_MUTE_LEFT_OFF | FM_Z_MUTE_RITE_OFF | \
1185 fmdev->rx.region.deemphasis);
1187 ret = fm_rx_set_audio_ctrl(fmdev, aud_ctrl);
1189 fmdev->rx.curr_rssi_threshold = DEF_V4L2_FM_SIGNAL_STRENGTH;
1192 pr_debug("(fmdrv) %s(): FM Set world region option : %d\n",
1193 __func__, DEF_V4L2_FM_WORLD_REGION);
1194 ret = fmc_set_region(fmdev, DEF_V4L2_FM_WORLD_REGION);
1196 pr_err("(fmdrv) %s(): Unable to set World region\n", __func__);
1199 fmdev->rx.curr_region = DEF_V4L2_FM_WORLD_REGION;
1201 *******************************************************************************************/
1204 #if(defined(DEF_V4L2_FM_WORLD_REGION) && DEF_V4L2_FM_WORLD_REGION == FM_REGION_NA)
1205 fmdev->rx.sch_step = FM_STEP_200KHZ;
1207 fmdev->rx.sch_step = FM_STEP_100KHZ;
1209 pr_debug("(fmdrv) %s(): FM Set Scan Step : 0x%x\n", __func__, fmdev->rx.sch_step);
1210 ret = fmc_set_scan_step(fmdev, fmdev->rx.sch_step);
1212 pr_err("(fmdrv) %s(): Unable to set scan step\n", __func__);
1217 fm_rx_enable_rds(fmdev);
1223 * Returns current FM mode (TX, RX, OFF) */
1224 int fmc_get_mode(struct fmdrv_ops *fmdev, unsigned char *fmmode)
1226 if (!test_bit(FM_CORE_READY, &fmdev->flag)) {
1227 pr_err("(fmdrv) %s(): FM core is not ready\n", __func__);
1230 if (fmmode == NULL) {
1231 pr_err("(fmdrv) %s(): Invalid memory\n", __func__);
1235 *fmmode = fmdev->curr_fmmode;
1240 * Called by LDisc layer when FM packet is available. The pointer to
1241 * this function is registered to LDisc during brcm_sh_ldisc_register() call.*/
1242 static long fm_st_receive(void *arg, struct sk_buff *skb)
1244 struct fmdrv_ops *fmdev;
1248 __u8 pkt_type = 0x08;
1250 fmdev = (struct fmdrv_ops *)arg;
1252 pr_debug("(fmdrv): %s()\n", __func__);
1255 pr_err("(fmdrv) %s(): Invalid SKB received from LDisp\n", __func__);
1258 if (skb->cb[0] != FM_PKT_LOGICAL_CHAN_NUMBER) {
1259 pr_err("(fmdrv) %s(): Received SKB (0x%p) is not FM Channel 8 pkt\n",
1264 for (len = 0; ((skb) && (len < skb->len)); len++)
1265 pr_info(">> 0x%02x ", skb->data[len]);
1268 memcpy(skb_push(skb, 1), &pkt_type, 1);
1269 skb_queue_tail(&fmdev->rx_q, skb);
1270 pr_info("\n(fmdrv) %s(): fm_st_receive: schedule recv tasklet\n",
1272 tasklet_schedule(&fmdev->rx_task);
1278 * This function will be called from FM V4L2 open function.
1279 * Register with shared ldisc driver and initialize driver data.
1281 int fmc_prepare(struct fmdrv_ops *fmdev)
1283 static struct sh_proto_s fm_st_proto;
1286 if (test_bit(FM_CORE_READY, &fmdev->flag)) {
1287 pr_info("(fmdrv) %s(): FM Core is already up\n", __func__);
1291 memset(&fm_st_proto, 0, sizeof(fm_st_proto));
1292 fm_st_proto.type = PROTO_SH_FM;
1293 fm_st_proto.recv = fm_st_receive;
1294 fm_st_proto.match_packet = NULL;
1295 fm_st_proto.write = NULL; /* shared ldisc driver will fill write pointer */
1296 fm_st_proto.priv_data = fmdev;
1298 /* Register with the shared line discipline */
1299 ret = hci_ldisc_register(&fm_st_proto);
1301 pr_err("(fmdrv) %s(): hci_ldisc_register failed %d\n",
1307 if (fm_st_proto.write != NULL) {
1308 g_bcm_write = fm_st_proto.write;
1311 pr_err("(fmdrv) %s(): Failed to get shared ldisc write func pointer\n", __func__);
1312 ret = hci_ldisc_unregister(PROTO_SH_FM);
1314 pr_err("(fmdrv) %s(): hci_ldisc_unregister failed %d\n", __func__, ret);
1319 spin_lock_init(&fmdev->resp_skb_lock);
1321 /* Initialize TX queue and TX tasklet */
1322 skb_queue_head_init(&fmdev->tx_q);
1323 tasklet_init(&fmdev->tx_task, __send_tasklet, (unsigned long)fmdev);
1325 /* Initialize RX Queue and RX tasklet */
1326 skb_queue_head_init(&fmdev->rx_q);
1327 tasklet_init(&fmdev->rx_task, __recv_tasklet, (unsigned long)fmdev);
1329 atomic_set(&fmdev->tx_cnt, 1);
1330 fmdev->response_completion = NULL;
1332 /* Do all the broadcom FM hardware specific initialization */
1333 fmdev->rx.curr_mute_mode = FM_MUTE_OFF;
1334 fmdev->rx.rds.rds_flag = FM_RDS_DISABLE;
1335 fmdev->rx.curr_region = DEF_V4L2_FM_WORLD_REGION;
1336 memcpy(&fmdev->rx.region, ®ion_configs[fmdev->rx.curr_region],
1337 sizeof(struct region_info));
1338 fmdev->rx.curr_freq = fmdev->rx.region.low_bound;
1339 fmdev->rx.rds_mode = FM_RDS_SYSTEM_NONE;
1340 fmdev->rx.curr_snr_threshold = FM_RX_SNR_MAX + 1;
1341 fmdev->rx.curr_cos_threshold = FM_RX_COS_DEFAULT;
1342 fmdev->rx.curr_sch_mode = FM_SCAN_NONE;
1343 fmdev->rx.curr_noise_floor = FM_NFE_DEFAILT;
1344 fmdev->rx.curr_volume = FM_RX_VOLUME_MAX;
1345 fmdev->rx.audio_mode = FM_AUTO_MODE;
1346 fmdev->rx.audio_path = FM_AUDIO_NONE;
1347 fmdev->rx.sch_step = FM_STEP_NONE;
1348 fmdev->device_info.capabilities = V4L2_CAP_HW_FREQ_SEEK | V4L2_CAP_TUNER |
1349 V4L2_CAP_RADIO | V4L2_CAP_MODULATOR |
1350 V4L2_CAP_AUDIO | V4L2_CAP_READWRITE | V4L2_CAP_RDS_CAPTURE;
1351 fmdev->device_info.type = V4L2_TUNER_RADIO;
1352 fmdev->device_info.rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
1353 fmdev->device_info.tuner_capability =V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_RDS;
1355 /* RDS initialization */
1356 fmc_reset_rds_cache(fmdev);
1357 init_waitqueue_head(&fmdev->rx.rds.read_queue);
1359 set_bit(FM_CORE_READY, &fmdev->flag);
1363 /* This function will be called from FM V4L2 release function.
1364 * Unregister from line discipline driver.
1366 int fmc_release(struct fmdrv_ops *fmdev)
1369 pr_info("(fmdrv) %s\n", __func__);
1371 if (!test_bit(FM_CORE_READY, &fmdev->flag)) {
1372 pr_info("(fmdrv) %s(): FM Core is already down\n", __func__);
1376 ret = hci_ldisc_unregister(PROTO_SH_FM);
1378 pr_err("(fmdrv) %s(): Failed to de-register FM from HCI LDisc - %d\n",
1381 pr_info("(fmdrv) %s(): Successfully unregistered from HCI LDisc\n",
1384 /* Sevice pending read */
1385 wake_up_interruptible(&fmdev->rx.rds.read_queue);
1387 tasklet_kill(&fmdev->tx_task);
1388 tasklet_kill(&fmdev->rx_task);
1390 skb_queue_purge(&fmdev->tx_q);
1391 skb_queue_purge(&fmdev->rx_q);
1393 fmdev->response_completion = NULL;
1394 fmdev->rx.curr_freq = 0;
1396 clear_bit(FM_CORE_READY, &fmdev->flag);
1400 /* Module init function. Ask FM V4L module to register video device.
1401 * Allocate memory for FM driver context
1403 static int __init fm_drv_init(void)
1405 struct fmdrv_ops *fmdev = NULL;
1408 pr_info("(fmdrv) %s(): FM driver version %s\n", __func__, FM_DRV_VERSION);
1410 fmdev = kzalloc(sizeof(struct fmdrv_ops), GFP_KERNEL);
1411 if (NULL == fmdev) {
1412 pr_err("(fmdrv) %s(): Can't allocate operation structure memory\n",
1417 fmdev->rx.rds.buf_size = default_rds_buf * FM_RDS_TUPLE_LENGTH;
1418 /* Allocate memory for RDS ring buffer */
1419 fmdev->rx.rds.cbuffer = kzalloc(fmdev->rx.rds.buf_size, GFP_KERNEL);
1420 if (fmdev->rx.rds.cbuffer == NULL) {
1421 pr_err("(fmdrv) %s(): Can't allocate rds ring buffer\n", __func__);
1426 ret = fm_v4l2_init_video_device(fmdev, radio_nr);
1433 fmdev->curr_fmmode = FM_MODE_OFF;
1437 /* Module exit function. Ask FM V4L module to unregister video device */
1438 static void __exit fm_drv_exit(void)
1440 struct fmdrv_ops *fmdev = NULL;
1441 pr_info("(fmdrv): %s\n", __func__);
1443 fmdev = fm_v4l2_deinit_video_device();
1444 if (fmdev != NULL) {
1449 module_init(fm_drv_init);
1450 module_exit(fm_drv_exit);
1452 /* ------------- Module Info ------------- */
1453 MODULE_AUTHOR("Satyajit Roy <roys@broadcom.com>, Syed Ibrahim Moosa <syedibrahim.moosa@broadcom.com>");
1454 MODULE_DESCRIPTION("FM Driver for Connectivity chip of Broadcom Corporation. "
1456 MODULE_VERSION(FM_DRV_VERSION);
1457 MODULE_LICENSE("GPL");