Re: [PATCH v4 1/6] drivers:staging: ti-st: fmdrv common header file

From: Hans Verkuil
Date: Thu Nov 18 2010 - 02:44:46 EST


On Tuesday, November 16, 2010 14:18:09 manjunatha_halli@xxxxxx wrote:
> From: Manjunatha Halli <manjunatha_halli@xxxxxx>
>
> These are common headers used in FM submodules (FM V4L2, FM common,
> FM Rx,and FM TX).
>
> Signed-off-by: Manjunatha Halli <manjunatha_halli@xxxxxx>
> ---
> drivers/staging/ti-st/fmdrv.h | 259 +++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 259 insertions(+), 0 deletions(-)
> create mode 100644 drivers/staging/ti-st/fmdrv.h
>
> diff --git a/drivers/staging/ti-st/fmdrv.h b/drivers/staging/ti-st/fmdrv.h
> new file mode 100644
> index 0000000..68ed44c
> --- /dev/null
> +++ b/drivers/staging/ti-st/fmdrv.h
> @@ -0,0 +1,259 @@
> +/*
> + * FM Driver for Connectivity chip of Texas Instruments.
> + *
> + * Common header for all FM driver sub-modules.
> + *
> + * Copyright (C) 2009 Texas Instruments
> + *
> + * 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
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
> + */
> +
> +#ifndef _FM_DRV_H
> +#define _FM_DRV_H
> +
> +#include <linux/skbuff.h>
> +#include <linux/interrupt.h>
> +#include <sound/core.h>
> +#include <sound/initval.h>
> +#include <linux/timer.h>
> +#include <linux/version.h>
> +
> +#define FM_DRV_VERSION "0.01"
> +/* Should match with FM_DRV_VERSION */
> +#define FM_DRV_RADIO_VERSION KERNEL_VERSION(0, 0, 1)
> +#define FM_DRV_NAME "ti_fmdrv"
> +#define FM_DRV_CARD_SHORT_NAME "TI FM Radio"
> +#define FM_DRV_CARD_LONG_NAME "Texas Instruments FM Radio"
> +
> +/* Flag info */
> +#define FM_INTTASK_RUNNING 0
> +#define FM_INTTASK_SCHEDULE_PENDING 1
> +#define FM_FIRMWARE_DW_INPROGRESS 2
> +#define FM_CORE_READY 3
> +#define FM_CORE_TRANSPORT_READY 4
> +#define FM_AF_SWITCH_INPROGRESS 5
> +#define FM_CORE_TX_XMITING 6
> +
> +#define FM_TUNE_COMPLETE 0x1
> +#define FM_BAND_LIMIT 0x2
> +
> +#define FM_DRV_TX_TIMEOUT (5*HZ) /* 5 seconds */
> +#define FM_DRV_RX_SEEK_TIMEOUT (20*HZ) /* 20 seconds */
> +
> +#define NO_OF_ENTRIES_IN_ARRAY(array) (sizeof(array) / sizeof(array[0]))
> +
> +enum {
> + FM_MODE_OFF,
> + FM_MODE_TX,
> + FM_MODE_RX,
> + FM_MODE_ENTRY_MAX
> +};
> +
> +#define FM_RX_RDS_INFO_FIELD_MAX 8 /* 4 Group * 2 Bytes */
> +
> +/* TODO:
> + * move the following CIDs to videodev2.h upon acceptance
> + */
> +#define V4L2_CTRL_CLASS_FM_RX 0x009c0000 /* FM Tuner control class */
> +/* FM Tuner class control IDs */
> +#define V4L2_CID_FM_RX_CLASS_BASE (V4L2_CTRL_CLASS_FM_RX | 0x900)
> +#define V4L2_CID_FM_RX_CLASS (V4L2_CTRL_CLASS_FM_RX | 1)
> +#define V4L2_CID_RSSI_THRESHOLD (V4L2_CID_FM_RX_CLASS_BASE + 2)
> +#define V4L2_CID_TUNE_AF (V4L2_CID_FM_RX_CLASS_BASE + 3)

Please post an RFC describing these new controls.

> +enum v4l2_tune_af {
> + V4L2_FM_AF_OFF = 0,
> + V4L2_FM_AF_ON = 1
> +};

Huh? If it is an on/off type of controls, then it should be a boolean.

> +#define V4L2_CID_FM_BAND (V4L2_CID_FM_RX_CLASS_BASE + 1)
> +enum v4l2_fm_band {
> + V4L2_FM_BAND_OTHER = 0,
> + V4L2_FM_BAND_JAPAN = 1,
> + V4L2_FM_BAND_OIRT = 2

This was proposed and rejected for the wl1273 driver. Instead the driver should
hide this complexity. See the wl1273 driver.

> +};
> +
> +/*
> + * define private CIDs for V4L2
> + */
> +#define V4L2_CID_CHANNEL_SPACING (V4L2_CID_PRIVATE_BASE + 0)

The wl1273 driver has defined a new standard channel spacing control. So that
should be used.

> +
> +/* RX RDS data format */
> +struct fm_rdsdata_format {
> + union {
> + struct {
> + unsigned char rdsbuff[FM_RX_RDS_INFO_FIELD_MAX];
> + } groupdatabuff;
> + struct {
> + unsigned short pidata;
> + unsigned char block_b_byte1;
> + unsigned char block_b_byte2;
> + unsigned char block_c_byte1;
> + unsigned char block_c_byte2;
> + unsigned char block_d_byte1;
> + unsigned char block_d_byte2;
> + } groupgeneral;
> + struct {
> + unsigned short pidata;
> + unsigned char block_b_byte1;
> + unsigned char block_b_byte2;
> + unsigned char firstaf;
> + unsigned char secondaf;
> + unsigned char firstpsbyte;
> + unsigned char secondpsbyte;
> + } group0A;
> +
> + struct {
> + unsigned short pidata;
> + unsigned char block_b_byte1;
> + unsigned char block_b_byte2;
> + unsigned short pidata2;
> + unsigned char firstpsbyte;
> + unsigned char secondpsbyte;
> + } group0B;
> + } rdsdata;
> +};
> +
> +/* FM region (Europe/US, Japan) info */
> +struct region_info {
> + unsigned int channel_spacing;
> + unsigned int bottom_frequency;
> + unsigned int top_frequency;
> + unsigned char region_index;
> +};
> +
> +typedef void (*int_handler_prototype) (void *);
> +
> +/* FM Interrupt processing related info */
> +struct fm_irq {
> + unsigned char stage_index;
> + unsigned short flag; /* FM interrupt flag */
> + unsigned short mask; /* FM interrupt mask */
> + /* Interrupt process timeout handler */
> + struct timer_list int_timeout_timer;
> + unsigned char irq_service_timeout_retry;
> + int_handler_prototype *fm_int_handlers;
> +};
> +
> +/* RDS info */
> +struct fm_rds {
> + unsigned char flag; /* RX RDS on/off status */
> + unsigned char last_block_index; /* Last received RDS block */
> +
> + /* RDS buffer */
> + wait_queue_head_t read_queue;
> + unsigned int buf_size; /* Size is always multiple of 3 */
> + unsigned int wr_index;
> + unsigned int rd_index;
> + unsigned char *buffer;
> +};
> +
> +#define FM_RDS_MAX_AF_LIST 25
> +
> +/*
> + * Current RX channel Alternate Frequency cache.
> + * This info is used to switch to other freq (AF)
> + * when current channel signal strengh is below RSSI threshold.
> + */
> +struct tuned_station_info {
> + unsigned short picode;
> + unsigned int af_cache[FM_RDS_MAX_AF_LIST];
> + unsigned char no_of_items_in_afcache;
> + unsigned char af_list_max;
> +};
> +
> +/* FM RX mode info */
> +struct fm_rx {
> + struct region_info region; /* Current selected band */
> + unsigned int curr_freq; /* Current RX frquency */
> + unsigned char curr_mute_mode; /* Current mute mode */
> + unsigned char curr_deemphasis_mode; /* Current deemphasis mode */
> + /* RF dependent soft mute mode */
> + unsigned char curr_rf_depend_mute;
> + unsigned short curr_volume; /* Current volume level */
> + short curr_rssi_threshold; /* Current RSSI threshold level */
> + /* Holds the index of the current AF jump */
> + unsigned char cur_afjump_index;
> + /* Will hold the frequency before the jump */
> + unsigned int freq_before_jump;
> + unsigned char rds_mode; /* RDS operation mode (RDS/RDBS) */
> + unsigned char af_mode; /* Alternate frequency on/off */
> + struct tuned_station_info cur_station_info;
> + struct fm_rds rds;
> +};
> +
> +/*
> + * FM TX RDS data
> + *
> + * @ text_type: is the text following PS or RT
> + * @ text: radio text string which could either be PS or RT
> + * @ af_freq: alternate frequency for Tx
> + * TODO: to be declared in application
> + */
> +struct tx_rds {
> + unsigned char text_type;
> + unsigned char text[25];
> + unsigned char flag;
> + unsigned int af_freq;
> +};
> +/*
> + * FM TX global data
> + *
> + * @ pwr_lvl: Power Level of the Transmission from mixer control
> + * @ xmit_state: Transmission state = Updated locally upon Start/Stop
> + * @ audio_io: i2S/Analog
> + * @ tx_frq: Transmission frequency
> + */
> +struct fmtx_data {
> + unsigned char pwr_lvl;
> + unsigned char xmit_state;
> + unsigned char audio_io;
> + unsigned char region;
> + unsigned short aud_mode;
> + unsigned int preemph;
> + unsigned long tx_frq;
> + struct tx_rds rds;
> +};
> +
> +/* FM driver operation structure */
> +struct fmdrv_ops {
> + struct video_device *radio_dev; /* V4L2 video device pointer */
> + struct snd_card *card; /* Card which holds FM mixer controls */
> + unsigned short asci_id;
> + spinlock_t rds_buff_lock; /* To protect access to RDS buffer */
> + spinlock_t resp_skb_lock; /* To protect access to received SKB */
> +
> + long flag; /* FM driver state machine info */
> + char streg_cbdata; /* status of ST registration */
> +
> + struct sk_buff_head rx_q; /* RX queue */
> + struct tasklet_struct rx_task; /* RX Tasklet */
> +
> + struct sk_buff_head tx_q; /* TX queue */
> + struct tasklet_struct tx_task; /* TX Tasklet */
> + unsigned long last_tx_jiffies; /* Timestamp of last pkt sent */
> + atomic_t tx_cnt; /* Number of packets can send at a time */
> +
> + struct sk_buff *response_skb; /* Response from the chip */
> + /* Main task completion handler */
> + struct completion maintask_completion;
> + /* Opcode of last command sent to the chip */
> + unsigned char last_sent_pkt_opcode;
> + /* Handler used for wakeup when response packet is received */
> + struct completion *response_completion;
> + struct fm_irq irq_info;
> + unsigned char curr_fmmode; /* Current FM chip mode (TX, RX, OFF) */
> + struct fm_rx rx; /* FM receiver info */
> + struct fmtx_data tx_data;
> +};
> +#endif
>

--
Hans Verkuil - video4linux developer - sponsored by Cisco
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/