diff options
author | G, Manjunath Kondaiah <manjugk@ti.com> | 2010-12-20 18:47:12 +0530 |
---|---|---|
committer | G, Manjunath Kondaiah <manjugk@ti.com> | 2010-12-20 18:47:12 +0530 |
commit | 567e327436d96216f17e735504f10cd6c340d216 (patch) | |
tree | 38b1ec483ec0deae07aba6552c9ea75c759326c8 /drivers/staging/ti-st/fmdrv_common.c | |
parent | f08e66d15a03bc7f728b68e3b114fc131fcfe747 (diff) | |
parent | b5de5469a80b9af394418b85ecd2b46502fcd51b (diff) |
Merge branch 'btfm_next-l24.11-p5' of git://dev.omapzoom.org/pub/scm/manju/L24x-btfm into L24.11ti-2.6.35-omap4-L24.11-p5
Diffstat (limited to 'drivers/staging/ti-st/fmdrv_common.c')
-rw-r--r-- | drivers/staging/ti-st/fmdrv_common.c | 728 |
1 files changed, 300 insertions, 428 deletions
diff --git a/drivers/staging/ti-st/fmdrv_common.c b/drivers/staging/ti-st/fmdrv_common.c index ae3641a04da9..dbc6c4fe2d53 100644 --- a/drivers/staging/ti-st/fmdrv_common.c +++ b/drivers/staging/ti-st/fmdrv_common.c @@ -14,6 +14,7 @@ * firmware files based on mode selection) * * Copyright (C) 2010 Texas Instruments + * Author: Raja Mani <raja_mani@ti.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -37,158 +38,9 @@ #include "fmdrv_v4l2.h" #include "fmdrv_common.h" #include "st.h" +#include "st_kim.h" #include "fmdrv_rx.h" -/* TODO: Enable when FM TX is supported */ -/* #include "fmdrv_tx.h" */ - -#ifndef DEBUG -#ifdef pr_info -#undef pr_info -#define pr_info(fmt, arg...) -#endif -#endif - -/* FM chip register table */ -static struct fm_reg_table fm_reg_info[] = { - /* ----- FM RX registers -------*/ - /* opcode, type(rd/wr), reg name */ - {0x00, REG_RD, "STEREO_GET"}, - {0x01, REG_RD, "RSSI_LVL_GET"}, - {0x02, REG_RD, "IF_COUNT_GET"}, - {0x03, REG_RD, "FLAG_GET"}, - {0x04, REG_RD, "RDS_SYNC_GET"}, - {0x05, REG_RD, "RDS_DATA_GET"}, - {0x0a, REG_WR, "FREQ_SET"}, - {0x0a, REG_RD, "FREQ_GET"}, - {0x0b, REG_WR, "AF_FREQ_SET"}, - {0x0b, REG_RD, "AF_FREQ_GET"}, - {0x0c, REG_WR, "MOST_MODE_SET"}, - {0x0c, REG_RD, "MOST_MODE_GET"}, - {0x0d, REG_WR, "MOST_BLEND_SET"}, - {0x0d, REG_RD, "MOST_BLEND_GET"}, - {0x0e, REG_WR, "DEMPH_MODE_SET"}, - {0x0e, REG_RD, "DEMPH_MODE_GET"}, - {0x0f, REG_WR, "SEARCH_LVL_SET"}, - {0x0f, REG_RD, "SEARCH_LVL_GET"}, - {0x10, REG_WR, "RX_BAND_SET"}, - {0x10, REG_RD, "RX_BAND_GET"}, - {0x11, REG_WR, "MUTE_STATUS_SET"}, - {0x11, REG_RD, "MUTE_STATUS_GET"}, - {0x12, REG_WR, "RDS_PAUSE_LVL_SET"}, - {0x12, REG_RD, "RDS_PAUSE_LVL_GET"}, - {0x13, REG_WR, "RDS_PAUSE_DUR_SET"}, - {0x13, REG_RD, "RDS_PAUSE_DUR_GET"}, - {0x14, REG_WR, "RDS_MEM_SET"}, - {0x14, REG_RD, "RDS_MEM_GET"}, - {0x15, REG_WR, "RDS_BLK_B_SET"}, - {0x15, REG_RD, "RDS_BLK_B_GET"}, - {0x16, REG_WR, "RDS_MSK_B_SET"}, - {0x16, REG_RD, "RDS_MSK_B_GET"}, - {0x17, REG_WR, "RDS_PI_MASK_SET"}, - {0x17, REG_RD, "RDS_PI_MASK_GET"}, - {0x18, REG_WR, "RDS_PI_SET"}, - {0x18, REG_RD, "RDS_PI_GET"}, - {0x19, REG_WR, "RDS_SYSTEM_SET"}, - {0x19, REG_RD, "RDS_SYSTEM_GET"}, - {0x1a, REG_WR, "INT_MASK_SET"}, - {0x1a, REG_RD, "INT_MASK_GET"}, - {0x1b, REG_WR, "SRCH_DIR_SET"}, - {0x1b, REG_RD, "SRCH_DIR_GET"}, - {0x1c, REG_WR, "VOLUME_SET"}, - {0x1c, REG_RD, "VOLUME_GET"}, - {0x1d, REG_WR, "AUDIO_ENABLE(SET)"}, - {0x1d, REG_RD, "AUDIO_ENABLE(GET)"}, - {0x1e, REG_WR, "PCM_MODE_SET"}, - {0x1e, REG_RD, "PCM_MODE_SET"}, - {0x1f, REG_WR, "I2S_MD_CFG_SET"}, - {0x1f, REG_RD, "I2S_MD_CFG_GET"}, - {0x20, REG_WR, "POWER_SET"}, - {0x20, REG_RD, "POWER_GET"}, - {0x21, REG_WR, "INTx_CONFIG_SET"}, - {0x21, REG_RD, "INTx_CONFIG_GET"}, - {0x22, REG_WR, "PULL_EN_SET"}, - {0x22, REG_RD, "PULL_EN_GET"}, - {0x23, REG_WR, "HILO_SET"}, - {0x23, REG_RD, "HILO_GET"}, - {0x24, REG_WR, "SWITCH2FREF"}, - {0x25, REG_WR, "FREQ_DRIFT_REP"}, - {0x28, REG_RD, "PCE_GET"}, - {0x29, REG_RD, "FIRM_VER_GET"}, - {0x2a, REG_RD, "ASIC_VER_GET"}, - {0x2b, REG_RD, "ASIC_ID_GET"}, - {0x2c, REG_RD, "MAIN_ID_GET"}, - {0x2d, REG_WR, "TUNER_MODE_SET"}, - {0x2e, REG_WR, "STOP_SEARCH"}, - {0x2f, REG_WR, "RDS_CNTRL_SET"}, - {0x64, REG_WR, "WR_HW_REG"}, - {0x65, REG_WR, "CODE_DOWNLOAD"}, - {0x66, REG_WR, "RESET"}, - {0xfe, REG_WR, "FM_POWER_MODE(SET)"}, - {0xff, REG_RD, "FM_INTERRUPT"}, - - /* --- FM TX registers ------ */ - {0x37, REG_WR, "CHANL_SET"}, - {0x37, REG_RD, "CHANL_GET"}, - {0x38, REG_WR, "CHANL_BW_SET"}, - {0x38, REG_RD, "CHANL_BW_GET"}, - {0x87, REG_WR, "REF_SET"}, - {0x87, REG_RD, "REF_GET"}, - {0x5a, REG_WR, "POWER_ENB_SET"}, - {0x3a, REG_WR, "POWER_ATT_SET"}, - {0x3a, REG_RD, "POWER_ATT_GET"}, - {0x3b, REG_WR, "POWER_LEL_SET"}, - {0x3b, REG_RD, "POWER_LEL_GET"}, - {0x3c, REG_WR, "AUDIO_DEV_SET"}, - {0x3c, REG_RD, "AUDIO_DEV_GET"}, - {0x3d, REG_WR, "PILOT_DEV_SET"}, - {0x3d, REG_RD, "PILOT_DEV_GET"}, - {0x3e, REG_WR, "RDS_DEV_SET"}, - {0x3e, REG_RD, "RDS_DEV_GET"}, - {0x5b, REG_WR, "PUPD_SET"}, - {0x3f, REG_WR, "AUDIO_IO_SET"}, - {0x40, REG_WR, "PREMPH_SET"}, - {0x40, REG_RD, "PREMPH_GET"}, - {0x41, REG_WR, "TX_BAND_SET"}, - {0x41, REG_RD, "TX_BAND_GET"}, - {0x42, REG_WR, "MONO_SET"}, - {0x42, REG_RD, "MONO_GET"}, - {0x5C, REG_WR, "MUTE"}, - {0x43, REG_WR, "MPX_LMT_ENABLE"}, - {0x06, REG_RD, "LOCK_GET"}, - {0x5d, REG_WR, "REF_ERR_SET"}, - {0x44, REG_WR, "PI_SET"}, - {0x44, REG_RD, "PI_GET"}, - {0x45, REG_WR, "TYPE_SET"}, - {0x45, REG_RD, "TYPE_GET"}, - {0x46, REG_WR, "PTY_SET"}, - {0x46, REG_RD, "PTY_GET"}, - {0x47, REG_WR, "AF_SET"}, - {0x47, REG_RD, "AF_GET"}, - {0x48, REG_WR, "DISPLAY_SIZE_SET"}, - {0x48, REG_RD, "DISPLAY_SIZE_GET"}, - {0x49, REG_WR, "RDS_MODE_SET"}, - {0x49, REG_RD, "RDS_MODE_GET"}, - {0x4a, REG_WR, "DISPLAY_MODE_SET"}, - {0x4a, REG_RD, "DISPLAY_MODE_GET"}, - {0x62, REG_WR, "LENGHT_SET"}, - {0x4b, REG_RD, "LENGHT_GET"}, - {0x4c, REG_WR, "TOGGLE_AB_SET"}, - {0x4c, REG_RD, "TOGGLE_AB_GET"}, - {0x4d, REG_WR, "RDS_REP_SET"}, - {0x4d, REG_RD, "RDS_REP_GET"}, - {0x63, REG_WR, "RDS_DATA_SET"}, - {0x5e, REG_WR, "RDS_DATA_ENB"}, - {0x4e, REG_WR, "TA_SET"}, - {0x4e, REG_RD, "TA_GET"}, - {0x4f, REG_WR, "TP_SET"}, - {0x4f, REG_RD, "TP_GET"}, - {0x50, REG_WR, "DI_SET"}, - {0x50, REG_RD, "DI_GET"}, - {0x51, REG_WR, "MS_SET"}, - {0x51, REG_RD, "MS_GET"}, - {0x52, REG_WR, "PS_SCROLL_SPEED_SET"}, - {0x52, REG_RD, "PS_SCROLL_SPEED_GET"}, -}; +#include "fmdrv_tx.h" /* Region info */ static struct region_info region_configs[] = { @@ -250,10 +102,11 @@ static void fm_irq_handle_low_rssi_finish(void *); static void fm_irq_send_intmsk_cmd(void *); static void fm_irq_handle_intmsk_cmd_resp(void *); -/* When FM common module receives interrupt packet, following handlers +/* + * When FM common module receives interrupt packet, following handlers * will be executed one after another to service the interrupt(s) */ -enum fmc_irq_handler_index{ +enum fmc_irq_handler_index { FM_SEND_FLAG_GETCMD_INDEX, FM_HANDLE_FLAG_GETCMD_RESP_INDEX, @@ -384,7 +237,8 @@ void fmc_update_region_info(struct fmdrv_ops *fmdev, sizeof(struct region_info)); } -/* FM common sub-module will schedule this tasklet whenever it receives +/* + * FM common sub-module will schedule this tasklet whenever it receives * FM packet from ST driver. */ static void __recv_tasklet(unsigned long arg) @@ -400,7 +254,7 @@ static void __recv_tasklet(unsigned long arg) while ((skb = skb_dequeue(&fmdev->rx_q))) { if (skb->len < sizeof(struct fm_event_msg_hdr)) { pr_err("(fmdrv): skb(%p) has only %d bytes" - "atleast need %d bytes to decode", + "atleast need %d bytes to decode\n", skb, skb->len, sizeof(struct fm_event_msg_hdr)); kfree_skb(skb); @@ -411,18 +265,19 @@ static void __recv_tasklet(unsigned long arg) num_fm_hci_cmds = fm_evt_hdr->num_fm_hci_cmds; /* FM interrupt packet? */ - if (fm_evt_hdr->fm_opcode == fm_reg_info[FM_INTERRUPT].opcode) { + if (fm_evt_hdr->fm_opcode == FM_INTERRUPT) { /* FM interrupt handler started already? */ if (!test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) { set_bit(FM_INTTASK_RUNNING, &fmdev->flag); if (fmdev->irq_info.stage_index != 0) { pr_err("(fmdrv): Invalid stage index," - "resetting to zero"); + "resetting to zero\n"); fmdev->irq_info.stage_index = 0; } - /* Execute first function - * in interrupt handler table + /* + * Execute first function in interrupt handler + * table. */ fmdev->irq_info.fm_int_handlers [fmdev->irq_info.stage_index](fmdev); @@ -436,7 +291,7 @@ static void __recv_tasklet(unsigned long arg) else if (fm_evt_hdr->fm_opcode == fmdev->last_sent_pkt_opcode && fmdev->response_completion != NULL) { if (fmdev->response_skb != NULL) - pr_err("(fmdrv): Response SKB ptr not NULL"); + pr_err("(fmdrv): Response SKB ptr not NULL\n"); spin_lock_irqsave(&fmdev->resp_skb_lock, flags); fmdev->response_skb = skb; @@ -450,7 +305,7 @@ static void __recv_tasklet(unsigned long arg) else if (fm_evt_hdr->fm_opcode == fmdev->last_sent_pkt_opcode && fmdev->response_completion == NULL) { if (fmdev->response_skb != NULL) - pr_err("(fmdrv): Response SKB ptr not NULL"); + pr_err("(fmdrv): Response SKB ptr not NULL\n"); spin_lock_irqsave(&fmdev->resp_skb_lock, flags); fmdev->response_skb = skb; @@ -463,12 +318,13 @@ static void __recv_tasklet(unsigned long arg) kfree_skb(skb); atomic_set(&fmdev->tx_cnt, 1); } else { - pr_err("(fmdrv): Nobody claimed SKB(%p),purging", skb); + pr_err("(fmdrv): Nobody claimed SKB(%p),purging\n", + skb); } - /* Check flow control field. - * If Num_FM_HCI_Commands field is not zero, - * schedule FM TX tasklet. + /* + * Check flow control field. If Num_FM_HCI_Commands field is + * not zero, schedule FM TX tasklet. */ if (num_fm_hci_cmds && atomic_read(&fmdev->tx_cnt)) { if (!skb_queue_empty(&fmdev->tx_q)) @@ -488,7 +344,7 @@ static void __send_tasklet(unsigned long arg) /* Check, is there any timeout happenned to last transmitted packet */ if (!atomic_read(&fmdev->tx_cnt) && ((jiffies - fmdev->last_tx_jiffies) > FM_DRV_TX_TIMEOUT)) { - pr_err("(fmdrv): TX timeout occurred"); + pr_err("(fmdrv): TX timeout occurred\n"); atomic_set(&fmdev->tx_cnt, 1); } /* Send queued FM TX packets */ @@ -500,7 +356,7 @@ static void __send_tasklet(unsigned long arg) if (fmdev->response_completion != NULL) pr_err("(fmdrv): Response completion handler" - "is not NULL"); + "is not NULL\n"); fmdev->response_completion = fm_cb(skb)->completion; @@ -509,8 +365,8 @@ static void __send_tasklet(unsigned long arg) if (len < 0) { kfree_skb(skb); fmdev->response_completion = NULL; - pr_err("(fmdrv): TX tasklet failed to send" \ - "skb(%p)", skb); + pr_err("(fmdrv): TX tasklet failed to send" + "skb(%p)\n", skb); atomic_set(&fmdev->tx_cnt, 1); } else { fmdev->last_tx_jiffies = jiffies; @@ -519,10 +375,13 @@ static void __send_tasklet(unsigned long arg) } } -/* Queues FM Channel-8 packet to FM TX queue and schedules FM TX tasklet for - * transmission */ -static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, - void *payload, int payload_len, +/* + * Queues FM Channel-8 packet to FM TX queue and schedules FM TX tasklet for + * transmission + */ +static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fm_opcode, + unsigned short int type, void *payload, + int payload_len, struct completion *wait_completion) { struct sk_buff *skb; @@ -530,13 +389,13 @@ static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, int size; - if (fmreg_index >= FM_REG_MAX_ENTRIES) { - pr_err("(fmdrv): Invalid fm register index"); + if (fm_opcode >= FM_INTERRUPT) { + pr_err("(fmdrv): Invalid fm register index\n"); return -EINVAL; } if (test_bit(FM_FIRMWARE_DW_INPROGRESS, &fmdev->flag) && payload == NULL) { - pr_err("(fmdrv): Payload data is NULL during fw download"); + pr_err("(fmdrv): Payload data is NULL during fw download\n"); return -EINVAL; } if (!test_bit(FM_FIRMWARE_DW_INPROGRESS, &fmdev->flag)) @@ -547,11 +406,13 @@ static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, skb = alloc_skb(size, GFP_ATOMIC); if (!skb) { - pr_err("(fmdrv): No memory to create new SKB"); + pr_err("(fmdrv): No memory to create new SKB\n"); return -ENOMEM; } - /* Don't fill FM header info for the commands which come from - * FM firmware file */ + /* + * Don't fill FM header info for the commands which come from + * FM firmware file. + */ if (!test_bit(FM_FIRMWARE_DW_INPROGRESS, &fmdev->flag) || test_bit(FM_INTTASK_RUNNING, &fmdev->flag)) { /* Fill command header info */ @@ -561,11 +422,20 @@ static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, /* 3 (fm_opcode,rd_wr,dlen) + payload len) */ cmd_hdr->len = ((payload == NULL) ? 0 : payload_len) + 3; /* FM opcode */ - cmd_hdr->fm_opcode = fm_reg_info[fmreg_index].opcode; + cmd_hdr->fm_opcode = fm_opcode; /* read/write type */ - cmd_hdr->rd_wr = fm_reg_info[fmreg_index].type; + cmd_hdr->rd_wr = type; cmd_hdr->dlen = payload_len; - fm_cb(skb)->fm_opcode = fm_reg_info[fmreg_index].opcode; + fm_cb(skb)->fm_opcode = fm_opcode; + /* + * If firmware download has finished and the command is + * not a read command then payload is != NULL - a write + * command with unsigned short payload - convert to be16 + */ + if (payload != NULL) { + *(unsigned short *)payload = + cpu_to_be16(*(unsigned short *)payload); + } } else if (payload != NULL) { fm_cb(skb)->fm_opcode = *((char *)payload + 2); } @@ -580,10 +450,9 @@ static int __fm_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, } /* Sends FM Channel-8 command to the chip and waits for the reponse */ -int fmc_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, - void *payload, int payload_len, - struct completion *wait_completion, void *reponse, - int *reponse_len) +int fmc_send_cmd(struct fmdrv_ops *fmdev, unsigned char fm_opcode, + unsigned short int type, void *payload, int payload_len, + void *reponse, int *reponse_len) { struct sk_buff *skb; struct fm_event_msg_hdr *fm_evt_hdr; @@ -591,23 +460,25 @@ int fmc_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, unsigned long flags; int ret; - init_completion(wait_completion); - ret = __fm_send_cmd(fmdev, fmreg_index, payload, payload_len, - wait_completion); + init_completion(&fmdev->maintask_completion); + ret = __fm_send_cmd(fmdev, fm_opcode, type, payload, payload_len, + &fmdev->maintask_completion); if (ret < 0) - return ret; + goto exit; - timeleft = wait_for_completion_timeout(wait_completion, + timeleft = wait_for_completion_timeout(&fmdev->maintask_completion, FM_DRV_TX_TIMEOUT); if (!timeleft) { pr_err("(fmdrv): Timeout(%d sec),didn't get reg" - "completion signal from RX tasklet", + "completion signal from RX tasklet\n", jiffies_to_msecs(FM_DRV_TX_TIMEOUT) / 1000); return -ETIMEDOUT; + goto exit; } if (!fmdev->response_skb) { - pr_err("(fmdrv): Reponse SKB is missing "); + pr_err("(fmdrv): Reponse SKB is missing\n"); return -EFAULT; + goto exit; } spin_lock_irqsave(&fmdev->resp_skb_lock, flags); skb = fmdev->response_skb; @@ -616,10 +487,11 @@ int fmc_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, fm_evt_hdr = (void *)skb->data; if (fm_evt_hdr->status != 0) { - pr_err("(fmdrv): Received event pkt status(%d) is not zero", + pr_err("(fmdrv): Received event pkt status(%d) is not zero\n", fm_evt_hdr->status); kfree_skb(skb); - return -EIO; + ret = -EIO; + goto exit; } /* Send reponse data to caller */ if (reponse != NULL && reponse_len != NULL && fm_evt_hdr->dlen) { @@ -631,7 +503,13 @@ int fmc_send_cmd(struct fmdrv_ops *fmdev, unsigned char fmreg_index, *reponse_len = 0; } kfree_skb(skb); - return 0; +exit: + if (ret < 0) { + pr_err("(fmdrv): Command %d failed\n", fm_opcode); + return ret; + } + + return ret; } /* --- Helper functions used in FM interrupt handlers ---*/ @@ -648,7 +526,7 @@ static inline int __check_cmdresp_status(struct fmdrv_ops *fmdev, fm_evt_hdr = (void *)(*skb)->data; if (fm_evt_hdr->status != 0) { - pr_err("(fmdrv): irq: opcode %x response status is not zero", + pr_err("(fmdrv): irq: opcode %x response status is not zero\n", fm_evt_hdr->fm_opcode); return -1; } @@ -656,7 +534,8 @@ static inline int __check_cmdresp_status(struct fmdrv_ops *fmdev, return 0; } -/* Interrupt process timeout handler. +/* + * Interrupt process timeout handler. * One of the irq handler did not get proper response from the chip. So take * recovery action here. FM interrupts are disabled in the beginning of * interrupt process. Therefore reset stage index to re-enable default @@ -666,7 +545,7 @@ static void __int_timeout_handler(unsigned long data) { struct fmdrv_ops *fmdev; - pr_info("(fmdrv): irq: timeout,trying to re-enable fm interrupts"); + pr_debug("(fmdrv): irq: timeout,trying to re-enable fm interrupts\n"); fmdev = (struct fmdrv_ops *)data; fmdev->irq_info.irq_service_timeout_retry++; @@ -676,13 +555,14 @@ static void __int_timeout_handler(unsigned long data) fmdev->irq_info.fm_int_handlers[fmdev->irq_info. stage_index] (fmdev); } else { - /* Stop recovery action (interrupt reenable process) and + /* + * Stop recovery action (interrupt reenable process) and * reset stage index & retry count values */ fmdev->irq_info.stage_index = 0; fmdev->irq_info.irq_service_timeout_retry = 0; - pr_err("(fmdrv): Recovery action failed during \ - irq processing, max retry reached"); + pr_err("(fmdrv): Recovery action failed during" + "irq processing, max retry reached\n"); } } @@ -695,10 +575,10 @@ static void fm_irq_send_flag_getcmd(void *arg) fmdev = arg; /* Send FLAG_GET command , to know the source of interrupt */ - ret = __fm_send_cmd(fmdev, FLAG_GET, NULL, sizeof(flag), NULL); + ret = __fm_send_cmd(fmdev, FLAG_GET, REG_RD, NULL, sizeof(flag), NULL); if (ret) pr_err("(fmdrv): irq: failed to send flag_get command," - "initiating irq recovery process"); + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_HANDLE_FLAG_GETCMD_RESP_INDEX; @@ -718,7 +598,7 @@ static void fm_irq_handle_flag_getcmd_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -729,8 +609,8 @@ static void fm_irq_handle_flag_getcmd_resp(void *arg) skb_pull(skb, sizeof(struct fm_event_msg_hdr)); memcpy(&fmdev->irq_info.flag, skb->data, fm_evt_hdr->dlen); - FM_STORE_BE16_TO_LE16(fmdev->irq_info.flag, fmdev->irq_info.flag); - pr_info("(fmdrv): irq: flag register(0x%x)", fmdev->irq_info.flag); + fmdev->irq_info.flag = be16_to_cpu(fmdev->irq_info.flag); + pr_debug("(fmdrv): irq: flag register(0x%x)\n", fmdev->irq_info.flag); /* Continue next function in interrupt handler table */ fmdev->irq_info.stage_index = FM_HW_MAL_FUNC_INDEX; @@ -744,7 +624,7 @@ static void fm_irq_handle_hw_malfunction(void *arg) fmdev = arg; if (fmdev->irq_info.flag & FM_MAL_EVENT & fmdev->irq_info.mask) - pr_err("(fmdrv): irq: HW MAL interrupt received - do nothing"); + pr_err("(fmdrv): irq: HW MAL int received - do nothing\n"); /* Continue next function in interrupt handler table */ fmdev->irq_info.stage_index = FM_RDS_START_INDEX; @@ -757,7 +637,7 @@ static void fm_irq_handle_rds_start(void *arg) fmdev = arg; if (fmdev->irq_info.flag & FM_RDS_EVENT & fmdev->irq_info.mask) { - pr_info("(fmdrv): irq: rds threshold reached"); + pr_debug("(fmdrv): irq: rds threshold reached\n"); fmdev->irq_info.stage_index = FM_RDS_SEND_RDS_GETCMD_INDEX; } else { /* Continue next function in interrupt handler table */ @@ -773,11 +653,11 @@ static void fm_irq_send_rdsdata_getcmd(void *arg) fmdev = arg; /* Send the command to read RDS data from the chip */ - ret = __fm_send_cmd(fmdev, RDS_DATA_GET, NULL, + ret = __fm_send_cmd(fmdev, RDS_DATA_GET, REG_RD, NULL, (FM_RX_RDS_FIFO_THRESHOLD * 3), NULL); if (ret < 0) pr_err("(fmdrv): irq : failed to send rds get command," - "initiating irq recovery process"); + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_RDS_HANDLE_RDS_GETCMD_RESP_INDEX; @@ -799,7 +679,7 @@ static void __fm_rx_update_af_cache(struct fmdrv_ops *fmdev, fmdev->rx.cur_station_info.af_list_max = (af - FM_RDS_1_AF_FOLLOWS + 1); fmdev->rx.cur_station_info.no_of_items_in_afcache = 0; - pr_info("(fmdrv): No of expected AF : %d", + pr_debug("(fmdrv): No of expected AF : %d\n", fmdev->rx.cur_station_info.af_list_max); } else if (((af >= FM_RDS_MIN_AF) && (fmdev->rx.region.region_index == FM_BAND_EUROPE_US) @@ -811,8 +691,8 @@ static void __fm_rx_update_af_cache(struct fmdrv_ops *fmdev, FM_RDS_MAX_AF_JAPAN))) { freq = fmdev->rx.region.bottom_frequency + (af * 100); if (freq == fmdev->rx.curr_freq) { - pr_info("(fmdrv): Current frequency(%d) is \ - matching with received AF(%d)", + pr_debug("(fmdrv): Current frequency(%d) is" + "matching with received AF(%d)\n", fmdev->rx.curr_freq, freq); return; } @@ -825,15 +705,16 @@ static void __fm_rx_update_af_cache(struct fmdrv_ops *fmdev, } /* Reached the limit of the list - ignore the next AF */ if (index == fmdev->rx.cur_station_info.af_list_max) { - pr_info("(fmdrv): AF cache is full"); + pr_debug("(fmdrv): AF cache is full\n"); return; } - /* If we reached the end of the list then - * this AF is not in the list - add it + /* + * If we reached the end of the list then this AF is not + * in the list - add it. */ if (index == fmdev->rx.cur_station_info. no_of_items_in_afcache) { - pr_info("(fmdrv): Storing AF %d to AF cache index %d", + pr_debug("(fmdrv): Storing AF %d to cache index %d\n", freq, index); fmdev->rx.cur_station_info.af_cache[index] = freq; fmdev->rx.cur_station_info.no_of_items_in_afcache++; @@ -841,8 +722,9 @@ static void __fm_rx_update_af_cache(struct fmdrv_ops *fmdev, } } -/* Converts RDS buffer data from big endian format - * to little endian format +/* + * Converts RDS buffer data from big endian format + * to little endian format. */ static void __fm_rdsparse_swapbytes(struct fmdrv_ops *fmdev, struct fm_rdsdata_format *rds_format) @@ -851,9 +733,11 @@ static void __fm_rdsparse_swapbytes(struct fmdrv_ops *fmdev, unsigned char index = 0; char *rds_buff; - /* Since in Orca the 2 RDS Data bytes are in little endian and + /* + * Since in Orca the 2 RDS Data bytes are in little endian and * in Dolphin they are in big endian, the parsing of the RDS data - * is chip dependent */ + * is chip dependent + */ if (fmdev->asci_id != 0x6350) { rds_buff = &rds_format->rdsdata.groupdatabuff.rdsbuff[0]; while (index + 1 < FM_RX_RDS_INFO_FIELD_MAX) { @@ -884,7 +768,7 @@ static void fm_irq_handle_rdsdata_getcmd_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -897,22 +781,28 @@ static void fm_irq_handle_rdsdata_getcmd_resp(void *arg) /* Parse the RDS data */ while (rds_len >= FM_RDS_BLOCK_SIZE) { meta_data = rds_data[2]; - /* Get the type: - * 0=A, 1=B, 2=C, 3=C', 4=D, 5=E */ + /* + * Get the type: + * 0=A, 1=B, 2=C, 3=C', 4=D, 5=E + */ type = (meta_data & 0x07); - /* Transform the block type - * into an index sequence (0, 1, 2, 3, 4) */ + /* + * Transform the block type into an + * index sequence (0, 1, 2, 3, 4) + */ block_index = (type <= FM_RDS_BLOCK_C ? type : (type - 1)); - pr_info("(fmdrv): Block index:%d(%s) ", block_index, + pr_debug("(fmdrv): Block index:%d(%s)\n", block_index, (meta_data & FM_RDS_STATUS_ERROR_MASK) ? "Bad" : "Ok"); if (((meta_data & FM_RDS_STATUS_ERROR_MASK) == 0) && (block_index == FM_RDS_BLOCK_INDEX_A || (block_index == fmdev->rx.rds.last_block_index + 1 && block_index <= FM_RDS_BLOCK_INDEX_D))) { - /* Skip checkword (control) byte - * and copy only data byte */ + /* + * Skip checkword (control) byte and copy only data + * byte + */ memcpy(&rds_format.rdsdata.groupdatabuff. rdsbuff[block_index * (FM_RDS_BLOCK_SIZE - 1)], rds_data, (FM_RDS_BLOCK_SIZE - 1)); @@ -920,24 +810,25 @@ static void fm_irq_handle_rdsdata_getcmd_resp(void *arg) /* If completed a whole group then handle it */ if (block_index == FM_RDS_BLOCK_INDEX_D) { - pr_info("(fmdrv): Good block received"); + pr_debug("(fmdrv): Good block received\n"); __fm_rdsparse_swapbytes(fmdev, &rds_format); - /* Extract PI code and store in local cache. - * We need this during AF switch processing */ - cur_picode = - FM_BE16_TO_LE16(rds_format.rdsdata. - groupgeneral.pidata); + /* + * Extract PI code and store in local cache. + * We need this during AF switch processing. + */ + cur_picode = be16_to_cpu + (rds_format.rdsdata.groupgeneral.pidata); if (fmdev->rx.cur_station_info.picode != cur_picode) fmdev->rx.cur_station_info.picode = cur_picode; - pr_info("(fmdrv): picode:%d", cur_picode); + pr_debug("(fmdrv): picode:%d\n", cur_picode); group_index = (rds_format.rdsdata.groupgeneral. block_b_byte1 >> 3); - pr_info("(fmdrv):Group:%ld%s", group_index / 2, + pr_debug("(fmdrv):Group:%ld%s\n", group_index/2, (group_index % 2) ? "B" : "A"); group_index = @@ -953,7 +844,7 @@ static void fm_irq_handle_rdsdata_getcmd_resp(void *arg) } } } else { - pr_info("(fmdrv): Block sequence mismatch"); + pr_debug("(fmdrv): Block sequence mismatch\n"); fmdev->rx.rds.last_block_index = -1; } rds_len -= FM_RDS_BLOCK_SIZE; @@ -966,7 +857,8 @@ static void fm_irq_handle_rdsdata_getcmd_resp(void *arg) spin_lock_irqsave(&fmdev->rds_buff_lock, flags); while (rds_len > 0) { - /* Fill RDS buffer as per V4L2 specification. + /* + * Fill RDS buffer as per V4L2 specification. * Store control byte */ type = (rds_data[2] & 0x07); @@ -986,7 +878,7 @@ static void fm_irq_handle_rdsdata_getcmd_resp(void *arg) /* Check for overflow & start over */ if (fmdev->rx.rds.wr_index == fmdev->rx.rds.rd_index) { - pr_info("(fmdrv): RDS buffer overflow"); + pr_debug("(fmdrv): RDS buffer overflow\n"); fmdev->rx.rds.wr_index = 0; fmdev->rx.rds.rd_index = 0; break; @@ -1020,7 +912,7 @@ static void fm_irq_handle_tune_op_ended(void *arg) fmdev = arg; if (fmdev->irq_info.flag & (FM_FR_EVENT | FM_BL_EVENT) & fmdev-> irq_info.mask) { - pr_info("(fmdrv): irq: tune ended/bandlimit reached"); + pr_debug("(fmdrv): irq: tune ended/bandlimit reached\n"); if (test_and_clear_bit(FM_AF_SWITCH_INPROGRESS, &fmdev->flag)) { fmdev->irq_info.stage_index = FM_AF_JUMP_RD_FREQ_INDEX; } else { @@ -1039,7 +931,7 @@ static void fm_irq_handle_power_enb(void *arg) fmdev = arg; if (fmdev->irq_info.flag & FM_POW_ENB_EVENT) { - pr_info("(fmdrv): irq: Power Enabled/Disabled"); + pr_debug("(fmdrv): irq: Power Enabled/Disabled\n"); complete(&fmdev->maintask_completion); } @@ -1057,8 +949,8 @@ static void fm_irq_handle_low_rssi_start(void *arg) (fmdev->irq_info.flag & FM_LEV_EVENT & fmdev->irq_info.mask) && (fmdev->rx.curr_freq != FM_UNDEFINED_FREQ) && (fmdev->rx.cur_station_info.no_of_items_in_afcache != 0)) { - pr_info("(fmdrv): irq: rssi level has fallen below" \ - " threshold level"); + pr_debug("(fmdrv): irq: rssi level has fallen below" + " threshold level\n"); /* Disable further low RSSI interrupts */ fmdev->irq_info.mask &= ~FM_LEV_EVENT; @@ -1081,12 +973,12 @@ static void fm_irq_afjump_set_pi(void *arg) fmdev = arg; /* Set PI code - must be updated if the AF list is not empty */ - payload = FM_LE16_TO_BE16(fmdev->rx.cur_station_info.picode); - ret = __fm_send_cmd(fmdev, RDS_PI_SET, &payload, sizeof(payload), - NULL); + payload = fmdev->rx.cur_station_info.picode; + ret = __fm_send_cmd(fmdev, RDS_PI_SET, REG_WR, &payload, + sizeof(payload), NULL); if (ret < 0) pr_err("(fmdrv): irq : failed to set PI," - "initiating irq recovery process"); + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_AF_JUMP_HANDLE_SETPI_RESP_INDEX; @@ -1106,7 +998,7 @@ static void fm_irq_handle_set_pi_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -1117,7 +1009,8 @@ static void fm_irq_handle_set_pi_resp(void *arg) fmdev->irq_info.fm_int_handlers[fmdev->irq_info.stage_index](fmdev); } -/* Set PI mask. +/* + * Set PI mask. * 0xFFFF = Enable PI code matching * 0x0000 = Disable PI code matching */ @@ -1129,11 +1022,11 @@ static void fm_irq_afjump_set_pimask(void *arg) fmdev = arg; payload = 0x0000; - ret = __fm_send_cmd(fmdev, RDS_PI_MASK_SET, &payload, sizeof(payload), - NULL); + ret = __fm_send_cmd(fmdev, RDS_PI_MASK_SET, REG_WR, &payload, + sizeof(payload), NULL); if (ret < 0) - pr_err("(fmdrv): irq: failed to set PI mask," - "initiating irq recovery process"); + pr_err("(fmdrv): irq: failed to set PI mask, " + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_AF_JUMP_HANDLE_SETPI_MASK_RESP_INDEX; @@ -1153,7 +1046,7 @@ static void fm_irq_handle_set_pimask_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -1171,18 +1064,18 @@ static void fm_irq_afjump_setfreq(void *arg) int ret; fmdev = arg; - pr_info("(fmdrv): Swtiching to %d KHz\n", + pr_debug("(fmdrv): Swtiching to %d KHz\n", fmdev->rx.cur_station_info.af_cache[fmdev->rx.cur_afjump_index]); frq_index = (fmdev->rx.cur_station_info.af_cache[fmdev->rx.cur_afjump_index] - fmdev->rx.region.bottom_frequency) / FM_FREQ_MUL; - FM_STORE_LE16_TO_BE16(payload, frq_index); - ret = __fm_send_cmd(fmdev, AF_FREQ_SET, &payload, sizeof(payload), - NULL); + payload = frq_index; + ret = __fm_send_cmd(fmdev, AF_FREQ_SET, REG_WR, &payload, + sizeof(payload), NULL); if (ret < 0) - pr_err("(fmdrv): irq : failed to set AF freq," - "initiating irq recovery process"); + pr_err("(fmdrv): irq : failed to set AF freq, " + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_AF_JUMP_HENDLE_SET_AFFREQ_RESP_INDEX; @@ -1202,7 +1095,7 @@ static void fm_irq_handle_setfreq_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -1221,12 +1114,12 @@ static void fm_irq_afjump_enableint(void *arg) fmdev = arg; /* Enable FR (tuning operation ended) interrupt */ - payload = FM_LE16_TO_BE16(FM_FR_EVENT); - ret = __fm_send_cmd(fmdev, INT_MASK_SET, &payload, sizeof(payload), - NULL); + payload = FM_FR_EVENT; + ret = __fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, + sizeof(payload), NULL); if (ret) - pr_err("(fmdrv): irq : failed to enable FR interrupt," - "initiating irq recovery process"); + pr_err("(fmdrv): irq : failed to enable FR interrupt, " + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_AF_JUMP_ENABLE_INT_RESP_INDEX; @@ -1245,7 +1138,7 @@ static void fm_irq_afjump_enableint_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -1262,12 +1155,12 @@ static void fm_irq_start_afjump(void *arg) int ret; fmdev = arg; - FM_STORE_LE16_TO_BE16(payload, FM_TUNER_AF_JUMP_MODE); - ret = __fm_send_cmd(fmdev, TUNER_MODE_SET, &payload, sizeof(payload), - NULL); + payload = FM_TUNER_AF_JUMP_MODE; + ret = __fm_send_cmd(fmdev, TUNER_MODE_SET, REG_WR, &payload, + sizeof(payload), NULL); if (ret) - pr_err("(fmdrv): irq : failed to start af switch," - "initiating irq recovery process"); + pr_err("(fmdrv): irq : failed to start af switch, " + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_AF_JUMP_HANDLE_START_AFJUMP_RESP_INDEX; @@ -1287,7 +1180,7 @@ static void fm_irq_handle_start_afjump_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -1304,10 +1197,11 @@ static void fm_irq_afjump_rd_freq(void *arg) int ret; fmdev = arg; - ret = __fm_send_cmd(fmdev, FREQ_GET, NULL, sizeof(payload), NULL); + ret = __fm_send_cmd(fmdev, FREQ_SET, REG_RD, NULL, + sizeof(payload), NULL); if (ret < 0) - pr_err("(fmdrv): irq: failed to read cur freq," - "initiating irq recovery process"); + pr_err("(fmdrv): irq: failed to read cur freq, " + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_AF_JUMP_RD_FREQ_RESP_INDEX; @@ -1329,7 +1223,7 @@ static void fm_irq_afjump_rd_freq_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; @@ -1337,7 +1231,7 @@ static void fm_irq_afjump_rd_freq_resp(void *arg) /* Skip header info and copy only response data */ skb_pull(skb, sizeof(struct fm_event_msg_hdr)); memcpy(&read_freq, skb->data, sizeof(read_freq)); - read_freq = FM_BE16_TO_LE16(read_freq); + read_freq = be16_to_cpu(read_freq); curr_freq = fmdev->rx.region.bottom_frequency + ((unsigned int)read_freq * FM_FREQ_MUL); @@ -1347,8 +1241,8 @@ static void fm_irq_afjump_rd_freq_resp(void *arg) /* If the frequency was changed the jump succeeded */ if ((curr_freq != fmdev->rx.freq_before_jump) && (curr_freq == jumped_freq)) { - pr_info("(fmdrv): Successfully switched to alternate" \ - "frequency %d", curr_freq); + pr_debug("(fmdrv): Successfully switched to alternate" + "frequency %d\n", curr_freq); fmdev->rx.curr_freq = curr_freq; fm_rx_reset_rds_cache(fmdev); @@ -1363,11 +1257,11 @@ static void fm_irq_afjump_rd_freq_resp(void *arg) /* If we reached the end of the list - stop searching */ if (fmdev->rx.cur_afjump_index >= fmdev->rx.cur_station_info.no_of_items_in_afcache) { - pr_info("(fmdrv): AF switch processing failed"); + pr_debug("(fmdrv): AF switch processing failed\n"); fmdev->irq_info.stage_index = FM_LOW_RSSI_FINISH_INDEX; } else { /* AF List is not over - try next one */ - pr_info("(fmdrv): Trying next frequency in af cache"); + pr_debug("(fmdrv): Trying next freq in AF cache\n"); fmdev->irq_info.stage_index = FM_AF_JUMP_SETPI_INDEX; } } @@ -1393,12 +1287,12 @@ static void fm_irq_send_intmsk_cmd(void *arg) fmdev = arg; /* Re-enable FM interrupts */ - FM_STORE_LE16_TO_BE16(payload, fmdev->irq_info.mask); - ret = __fm_send_cmd(fmdev, INT_MASK_SET, &payload, sizeof(payload), - NULL); + payload = fmdev->irq_info.mask; + ret = __fm_send_cmd(fmdev, INT_MASK_SET, REG_WR, &payload, + sizeof(payload), NULL); if (ret) - pr_err("(fmdrv): irq: failed to send int_mask_set cmd," - "initiating irq recovery process"); + pr_err("(fmdrv): irq: failed to send int_mask_set cmd, " + "initiating irq recovery process\n"); else fmdev->irq_info.stage_index = FM_HANDLE_INTMSK_CMD_RESP_INDEX; @@ -1418,12 +1312,13 @@ static void fm_irq_handle_intmsk_cmd_resp(void *arg) ret = __check_cmdresp_status(fmdev, &skb); if (ret < 0) { - pr_err("(fmdrv): Initiating irq recovery process"); + pr_err("(fmdrv): Initiating irq recovery process\n"); mod_timer(&fmdev->irq_info.int_timeout_timer, jiffies + FM_DRV_TX_TIMEOUT); return; } - /* This is last function in interrupt table to be executed. + /* + * This is last function in interrupt table to be executed. * So, reset stage index to 0. */ fmdev->irq_info.stage_index = FM_SEND_FLAG_GETCMD_INDEX; @@ -1505,9 +1400,8 @@ int fmc_set_frequency(struct fmdrv_ops *fmdev, unsigned int freq_to_set) break; case FM_MODE_TX: - /* TODO: Enable when FM TX is supported */ - /* ret = fm_tx_set_frequency(fmdev, freq_to_set); */ - /* break; */ + ret = fm_tx_set_frequency(fmdev, freq_to_set); + break; default: ret = -EINVAL; @@ -1520,14 +1414,12 @@ int fmc_get_frequency(struct fmdrv_ops *fmdev, unsigned int *cur_tuned_frq) int ret = 0; if (fmdev->rx.curr_freq == FM_UNDEFINED_FREQ) { - pr_err("(fmdrv): RX frequency is not set"); - ret = -EPERM; - goto exit; + pr_err("(fmdrv): RX frequency is not set\n"); + return -EPERM; } if (cur_tuned_frq == NULL) { - pr_err("(fmdrv): Invalid memory"); - ret = -ENOMEM; - goto exit; + pr_err("(fmdrv): Invalid memory\n"); + return -ENOMEM; } switch (fmdev->curr_fmmode) { @@ -1542,15 +1434,8 @@ int fmc_get_frequency(struct fmdrv_ops *fmdev, unsigned int *cur_tuned_frq) default: ret = -EINVAL; } -exit: - return ret; -} -/* Returns current band index (0-Europe/US; 1-Japan) */ -int fmc_get_region(struct fmdrv_ops *fmdev, unsigned char *region) -{ - *region = fmdev->rx.region.region_index; - return 0; + return ret; } int fmc_set_region(struct fmdrv_ops *fmdev, unsigned char region_to_set) @@ -1563,9 +1448,8 @@ int fmc_set_region(struct fmdrv_ops *fmdev, unsigned char region_to_set) break; case FM_MODE_TX: - /* TODO: Enable when FM TX is supported */ - /* ret = fm_tx_set_region(fmdev, region_to_set); */ - /* break; */ + ret = fm_tx_set_region(fmdev, region_to_set); + break; default: ret = -EINVAL; @@ -1583,9 +1467,8 @@ int fmc_set_mute_mode(struct fmdrv_ops *fmdev, unsigned char mute_mode_toset) break; case FM_MODE_TX: - /* TODO: Enable when FM TX is supported */ - /* ret = fm_tx_set_mute_mode(fmdev, mute_mode_toset); */ - /* break; */ + ret = fm_tx_set_mute_mode(fmdev, mute_mode_toset); + break; default: ret = -EINVAL; @@ -1603,9 +1486,8 @@ int fmc_set_stereo_mono(struct fmdrv_ops *fmdev, unsigned short mode) break; case FM_MODE_TX: - /* TODO: Enable when FM TX is supported */ - /* ret = fm_tx_set_stereo_mono(fmdev, mode); */ - /* break; */ + ret = fm_tx_set_stereo_mono(fmdev, mode); + break; default: ret = -EINVAL; @@ -1623,9 +1505,8 @@ int fmc_set_rds_mode(struct fmdrv_ops *fmdev, unsigned char rds_en_dis) break; case FM_MODE_TX: - /* TODO: Enable when FM TX is supported */ - /* ret = fm_tx_set_rds_mode(fmdev, rds_en_dis); */ - /* break; */ + ret = fm_tx_set_rds_mode(fmdev, rds_en_dis); + break; default: ret = -EINVAL; @@ -1640,25 +1521,24 @@ static int fm_power_down(struct fmdrv_ops *fmdev) int ret = 0; if (!test_bit(FM_CORE_READY, &fmdev->flag)) { - pr_err("(fmdrv): FM core is not ready"); - ret = -EPERM; - goto exit; + pr_err("(fmdrv): FM core is not ready\n"); + return -EPERM; } if (fmdev->curr_fmmode == FM_MODE_OFF) { - pr_err("(fmdrv): FM chip is already in OFF state"); - goto exit; + pr_debug("(fmdrv): FM chip is already in OFF state\n"); + return ret; } - FM_STORE_LE16_TO_BE16(payload, 0x0); - ret = fmc_send_cmd(fmdev, FM_POWER_MODE, &payload, sizeof(payload), - &fmdev->maintask_completion, NULL, NULL); - FM_CHECK_SEND_CMD_STATUS(ret); + payload = 0x0; + ret = fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload, + sizeof(payload), NULL, NULL); + if (ret < 0) + return ret; ret = fmc_release(fmdev); if (ret < 0) - pr_err("(fmdrv): FM CORE release failed"); + pr_err("(fmdrv): FM CORE release failed\n"); -exit: return ret; } @@ -1678,13 +1558,12 @@ static int fm_download_firmware(struct fmdrv_ops *fmdev, ret = request_firmware(&fw_entry, firmware_name, &fmdev->radio_dev->dev); - if ((ret < 0) || (fw_entry == NULL) || (fw_entry->data == NULL) || - (fw_entry->size == 0)) { + if (ret < 0) { pr_err("(fmdrv): Unable to read firmware(%s) content\n", firmware_name); - goto exit; + return ret; } - pr_info("(fmdrv): Firmware(%s) length : %d bytes", firmware_name, + pr_debug("(fmdrv): Firmware(%s) length : %d bytes\n", firmware_name, fw_entry->size); fw_data = (void *)fw_entry->data; @@ -1692,12 +1571,12 @@ static int fm_download_firmware(struct fmdrv_ops *fmdev, fw_header = (struct bts_header *)fw_data; if (fw_header->magic != FM_FW_FILE_HEADER_MAGIC) { - pr_err("(fmdrv): %s not a legal TI firmware file", + pr_err("(fmdrv): %s not a legal TI firmware file\n", firmware_name); ret = -EINVAL; - goto exit; + goto rel_fw; } - pr_info("(fmdrv): Firmware(%s) magic number : 0x%x", firmware_name, + pr_debug("(fmdrv): Firmware(%s) magic number : 0x%x\n", firmware_name, fw_header->magic); /* Skip file header info , we already verified it */ @@ -1709,11 +1588,10 @@ static int fm_download_firmware(struct fmdrv_ops *fmdev, switch (action->type) { case ACTION_SEND_COMMAND: /* Send */ - ret = fmc_send_cmd(fmdev, 0, action->data, - action->size, &fmdev->maintask_completion, - NULL, NULL); + ret = fmc_send_cmd(fmdev, 0, 0, action->data, + action->size, NULL, NULL); if (ret < 0) - goto exit; + goto rel_fw; cmd_cnt++; break; @@ -1727,10 +1605,11 @@ static int fm_download_firmware(struct fmdrv_ops *fmdev, fw_data += (sizeof(struct bts_action) + (action->size)); fw_len -= (sizeof(struct bts_action) + (action->size)); } - pr_info("(fmdrv): Firmare commands(%d) loaded to the chip", cmd_cnt); -exit: + pr_debug("(fmdrv): Firmare commands(%d) loaded to chip\n", cmd_cnt); +rel_fw: release_firmware(fw_entry); clear_bit(FM_FIRMWARE_DW_INPROGRESS, &fmdev->flag); + return ret; } @@ -1755,71 +1634,64 @@ static int fm_power_up(struct fmdrv_ops *fmdev, unsigned char fw_option) char fw_name[50]; if (fw_option >= FM_MODE_ENTRY_MAX) { - pr_err("(fmdrv): Invalid firmware download option"); - ret = -EINVAL; - goto exit; + pr_err("(fmdrv): Invalid firmware download option\n"); + return -EINVAL; } - /* Initialize FM common module. FM GPIO toggling is + /* + * Initialize FM common module. FM GPIO toggling is * taken care in Shared Transport driver. */ ret = fmc_prepare(fmdev); if (ret < 0) { - pr_err("(fmdrv): Unable to prepare FM Common"); - goto exit; + pr_err("(fmdrv): Unable to prepare FM Common\n"); + return ret; } - FM_STORE_LE16_TO_BE16(payload, FM_ENABLE); - ret = fmc_send_cmd(fmdev, FM_POWER_MODE, &payload, sizeof(payload), - &fmdev->maintask_completion, NULL, NULL); - if (ret < 0) { - pr_err("(fmdrv): Failed enable FM over Channel 8"); + payload = FM_ENABLE; + ret = fmc_send_cmd(fmdev, FM_POWER_MODE, REG_WR, &payload, + sizeof(payload), NULL, NULL); + if (ret < 0) goto rel; - } /* Allow the chip to settle down in Channel-8 mode */ - msleep(5); + msleep(20); - ret = fmc_send_cmd(fmdev, ASIC_ID_GET, NULL, sizeof(asic_id), - &fmdev->maintask_completion, &asic_id, - &resp_len); - if (ret < 0) { - pr_err("(fmdrv): Failed read FM chip ASIC ID"); + ret = fmc_send_cmd(fmdev, ASIC_ID_GET, REG_RD, NULL, + sizeof(asic_id), &asic_id, &resp_len); + if (ret < 0) goto rel; - } - ret = fmc_send_cmd(fmdev, ASIC_VER_GET, NULL, sizeof(asic_ver), - &fmdev->maintask_completion, &asic_ver, - &resp_len); - if (ret < 0) { - pr_err("(fmdrv): Failed read FM chip ASIC Version"); + + ret = fmc_send_cmd(fmdev, ASIC_VER_GET, REG_RD, NULL, + sizeof(asic_ver), &asic_ver, &resp_len); + if (ret < 0) goto rel; - } - pr_info("(fmdrv): ASIC ID: 0x%x , ASIC Version: %d", - FM_BE16_TO_LE16(asic_id), FM_BE16_TO_LE16(asic_ver)); + pr_debug("(fmdrv): ASIC ID: 0x%x , ASIC Version: %d\n", + be16_to_cpu(asic_id), be16_to_cpu(asic_ver)); sprintf(fw_name, "%s_%x.%d.bts", FM_FMC_FW_FILE_START, - FM_BE16_TO_LE16(asic_id), FM_BE16_TO_LE16(asic_ver)); + be16_to_cpu(asic_id), be16_to_cpu(asic_ver)); ret = fm_download_firmware(fmdev, fw_name); if (ret < 0) { - pr_info("(fmdrv): Failed to download firmware file %s\n", + pr_debug("(fmdrv): Failed to download firmware file %s\n", fw_name); goto rel; } sprintf(fw_name, "%s_%x.%d.bts", (fw_option == FM_MODE_RX) ? FM_RX_FW_FILE_START : FM_TX_FW_FILE_START, - FM_BE16_TO_LE16(asic_id), FM_BE16_TO_LE16(asic_ver)); + be16_to_cpu(asic_id), be16_to_cpu(asic_ver)); ret = fm_download_firmware(fmdev, fw_name); if (ret < 0) { - pr_info("(fmdrv): Failed to download firmware file %s\n", + pr_debug("(fmdrv): Failed to download firmware file %s\n", fw_name); goto rel; } else - goto exit; + return ret; rel: fmc_release(fmdev); -exit: + return ret; } @@ -1829,21 +1701,20 @@ int fmc_set_mode(struct fmdrv_ops *fmdev, unsigned char fm_mode) int ret = 0; if (fm_mode >= FM_MODE_ENTRY_MAX) { - pr_err("(fmdrv): Invalid FM mode"); - ret = -EINVAL; - goto exit; + pr_err("(fmdrv): Invalid FM mode\n"); + return -EINVAL; } if (fmdev->curr_fmmode == fm_mode) { - pr_info("(fmdrv): Already fm is in mode(%d)", fm_mode); - goto exit; + pr_debug("(fmdrv): Already fm is in mode(%d)\n", fm_mode); + return ret; } switch (fm_mode) { case FM_MODE_OFF: /* OFF Mode */ ret = fm_power_down(fmdev); if (ret < 0) { - pr_err("(fmdrv): Failed to set OFF mode"); - goto exit; + pr_err("(fmdrv): Failed to set OFF mode\n"); + return ret; } break; @@ -1853,27 +1724,27 @@ int fmc_set_mode(struct fmdrv_ops *fmdev, unsigned char fm_mode) if (fmdev->curr_fmmode != FM_MODE_OFF) { ret = fm_power_down(fmdev); if (ret < 0) { - pr_err("(fmdrv): Failed to set OFF mode"); - goto exit; + pr_err("(fmdrv): Failed to set OFF mode\n"); + return ret; } msleep(30); } ret = fm_power_up(fmdev, fm_mode); if (ret < 0) { pr_err("(fmdrv): Failed to load firmware\n"); - goto exit; + return ret; } } fmdev->curr_fmmode = fm_mode; /* Set default configuration */ if (fmdev->curr_fmmode == FM_MODE_RX) { - pr_info("(fmdrv): Loading default rx configuration..\n"); + pr_debug("(fmdrv): Loading default rx configuration..\n"); ret = __load_default_rx_configuration(fmdev); if (ret < 0) pr_err("(fmdrv): Failed to load default values\n"); } -exit: + return ret; } @@ -1881,11 +1752,11 @@ exit: int fmc_get_mode(struct fmdrv_ops *fmdev, unsigned char *fmmode) { if (!test_bit(FM_CORE_READY, &fmdev->flag)) { - pr_err("(fmdrv): FM core is not ready"); + pr_err("(fmdrv): FM core is not ready\n"); return -EPERM; } if (fmmode == NULL) { - pr_err("(fmdrv): Invalid memory"); + pr_err("(fmdrv): Invalid memory\n"); return -ENOMEM; } @@ -1901,12 +1772,12 @@ static long fm_st_receive(void *arg, struct sk_buff *skb) fmdev = (struct fmdrv_ops *)arg; if (skb == NULL) { - pr_err("(fmdrv): Invalid SKB received from ST"); + pr_err("(fmdrv): Invalid SKB received from ST\n"); return -EFAULT; } if (skb->cb[0] != FM_PKT_LOGICAL_CHAN_NUMBER) { - pr_err("(fmdrv): Received SKB (%p) is not FM Channel 8 pkt", + pr_err("(fmdrv): Received SKB (%p) is not FM Channel 8 pkt\n", skb); return -EINVAL; } @@ -1918,7 +1789,8 @@ static long fm_st_receive(void *arg, struct sk_buff *skb) return 0; } -/* Called by ST layer to indicate protocol registration completion +/* + * Called by ST layer to indicate protocol registration completion * status. */ static void fm_st_reg_comp_cb(void *arg, char data) @@ -1930,7 +1802,8 @@ static void fm_st_reg_comp_cb(void *arg, char data) complete(&wait_for_fmdrv_reg_comp); } -/* This function will be called from FM V4L2 open function. +/* + * This function will be called from FM V4L2 open function. * Register with ST driver and initialize driver data. */ int fmc_prepare(struct fmdrv_ops *fmdev) @@ -1940,8 +1813,8 @@ int fmc_prepare(struct fmdrv_ops *fmdev) int ret = 0; if (test_bit(FM_CORE_READY, &fmdev->flag)) { - pr_info("(fmdrv): FM Core is already up"); - goto exit; + pr_debug("(fmdrv): FM Core is already up\n"); + return ret; } memset(&fm_st_proto, 0, sizeof(fm_st_proto)); @@ -1956,43 +1829,38 @@ int fmc_prepare(struct fmdrv_ops *fmdev) if (ret == -EINPROGRESS) { init_completion(&wait_for_fmdrv_reg_comp); fmdev->streg_cbdata = -EINPROGRESS; - pr_info("(fmdrv): %s waiting for ST reg completion signal", - __func__); + pr_debug("(fmdrv): %s waiting for ST reg completion signal\n", + __func__); timeleft = wait_for_completion_timeout(&wait_for_fmdrv_reg_comp, FM_ST_REGISTER_TIMEOUT); if (!timeleft) { - pr_err("(fmdrv): Timeout(%d sec), didn't get reg" - "completion signal from ST", - jiffies_to_msecs(FM_ST_REGISTER_TIMEOUT) / - 1000); - ret = -ETIMEDOUT; - goto exit; + pr_err("(fmdrv): Timeout(%d sec), didn't get reg " + "completion signal from ST\n", + jiffies_to_msecs(FM_ST_REGISTER_TIMEOUT) / 1000); + return -ETIMEDOUT; } if (fmdev->streg_cbdata != 0) { - pr_err("(fmdrv): ST reg comp CB called with error" - "status %d", fmdev->streg_cbdata); - ret = -EAGAIN; - goto exit; + pr_err("(fmdrv): ST reg comp CB called with error " + "status %d\n", fmdev->streg_cbdata); + return -EAGAIN; } ret = 0; } else if (ret == -1) { - pr_err("(fmdrv): st_register failed %d", ret); - ret = -EAGAIN; - goto exit; + pr_err("(fmdrv): st_register failed %d\n", ret); + return -EAGAIN; } if (fm_st_proto.write != NULL) { g_st_write = fm_st_proto.write; } else { - pr_err("(fmdrv): Failed to get ST write func pointer"); + pr_err("(fmdrv): Failed to get ST write func pointer\n"); ret = st_unregister(ST_FM); if (ret < 0) - pr_err("(fmdrv): st_unregister failed %d", ret); - ret = -EAGAIN; - goto exit; + pr_err("(fmdrv): st_unregister failed %d\n", ret); + return -EAGAIN; } spin_lock_init(&fmdev->rds_buff_lock); @@ -2034,11 +1902,12 @@ int fmc_prepare(struct fmdrv_ops *fmdev) fm_rx_reset_curr_station_info(fmdev); set_bit(FM_CORE_READY, &fmdev->flag); -exit: + return ret; } -/* This function will be called from FM V4L2 release function. +/* + * This function will be called from FM V4L2 release function. * Unregister from ST driver. */ int fmc_release(struct fmdrv_ops *fmdev) @@ -2046,7 +1915,7 @@ int fmc_release(struct fmdrv_ops *fmdev) int ret; if (!test_bit(FM_CORE_READY, &fmdev->flag)) { - pr_info("(fmdrv): FM Core is already down"); + pr_debug("(fmdrv): FM Core is already down\n"); return 0; } /* Sevice pending read */ @@ -2063,15 +1932,16 @@ int fmc_release(struct fmdrv_ops *fmdev) ret = st_unregister(ST_FM); if (ret < 0) - pr_err("(fmdrv): Failed to de-register FM from ST - %d", ret); + pr_err("(fmdrv): Failed to de-register FM from ST %d\n", ret); else - pr_info("(fmdrv): Successfully unregistered from ST"); + pr_debug("(fmdrv): Successfully unregistered from ST\n"); clear_bit(FM_CORE_READY, &fmdev->flag); return ret; } -/* Module init function. Ask FM V4L module to register video device. +/* + * Module init function. Ask FM V4L module to register video device. * Allocate memory for FM driver context and RX RDS buffer. */ static int __init fm_drv_init(void) @@ -2079,17 +1949,17 @@ static int __init fm_drv_init(void) struct fmdrv_ops *fmdev = NULL; int ret = -ENOMEM; - pr_info("(fmdrv): FM driver version %s", FM_DRV_VERSION); + pr_debug("(fmdrv): FM driver version %s\n", FM_DRV_VERSION); fmdev = kzalloc(sizeof(struct fmdrv_ops), GFP_KERNEL); if (NULL == fmdev) { - pr_err("(fmdrv): Can't allocate operation structure memory"); - goto exit; + pr_err("(fmdrv): Can't allocate operation structure memory\n"); + return ret; } fmdev->rx.rds.buf_size = default_rds_buf * FM_RDS_BLOCK_SIZE; fmdev->rx.rds.buffer = kzalloc(fmdev->rx.rds.buf_size, GFP_KERNEL); if (NULL == fmdev->rx.rds.buffer) { - pr_err("(fmdrv): Can't allocate rds ring buffer"); + pr_err("(fmdrv): Can't allocate rds ring buffer\n"); goto rel_dev; } @@ -2099,13 +1969,15 @@ static int __init fm_drv_init(void) fmdev->irq_info.fm_int_handlers = g_IntHandlerTable; fmdev->curr_fmmode = FM_MODE_OFF; - goto exit; + fmdev->tx_data.pwr_lvl = FM_PWR_LVL_DEF; + fmdev->tx_data.preemph = FM_TX_PREEMPH_50US; + return ret; rel_rdsbuf: kfree(fmdev->rx.rds.buffer); rel_dev: kfree(fmdev); -exit: + return ret; } |