root/drivers/media/radio/wl128x/fmdrv.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  *  FM Driver for Connectivity chip of Texas Instruments.
   4  *
   5  *  Common header for all FM driver sub-modules.
   6  *
   7  *  Copyright (C) 2011 Texas Instruments
   8  */
   9 
  10 #ifndef _FM_DRV_H
  11 #define _FM_DRV_H
  12 
  13 #include <linux/skbuff.h>
  14 #include <linux/interrupt.h>
  15 #include <sound/core.h>
  16 #include <sound/initval.h>
  17 #include <linux/timer.h>
  18 #include <media/v4l2-ioctl.h>
  19 #include <media/v4l2-common.h>
  20 #include <media/v4l2-device.h>
  21 #include <media/v4l2-ctrls.h>
  22 
  23 #define FM_DRV_VERSION            "0.1.1"
  24 #define FM_DRV_NAME               "ti_fmdrv"
  25 #define FM_DRV_CARD_SHORT_NAME    "TI FM Radio"
  26 #define FM_DRV_CARD_LONG_NAME     "Texas Instruments FM Radio"
  27 
  28 /* Flag info */
  29 #define FM_INTTASK_RUNNING            0
  30 #define FM_INTTASK_SCHEDULE_PENDING   1
  31 #define FM_FW_DW_INPROGRESS     2
  32 #define FM_CORE_READY                 3
  33 #define FM_CORE_TRANSPORT_READY       4
  34 #define FM_AF_SWITCH_INPROGRESS       5
  35 #define FM_CORE_TX_XMITING            6
  36 
  37 #define FM_TUNE_COMPLETE              0x1
  38 #define FM_BAND_LIMIT                 0x2
  39 
  40 #define FM_DRV_TX_TIMEOUT      (5*HZ)   /* 5 seconds */
  41 #define FM_DRV_RX_SEEK_TIMEOUT (20*HZ)  /* 20 seconds */
  42 
  43 #define fmerr(format, ...) \
  44         printk(KERN_ERR "fmdrv: " format, ## __VA_ARGS__)
  45 #define fmwarn(format, ...) \
  46         printk(KERN_WARNING "fmdrv: " format, ##__VA_ARGS__)
  47 #ifdef DEBUG
  48 #define fmdbg(format, ...) \
  49         printk(KERN_DEBUG "fmdrv: " format, ## __VA_ARGS__)
  50 #else /* DEBUG */
  51 #define fmdbg(format, ...) do {} while(0)
  52 #endif
  53 enum {
  54         FM_MODE_OFF,
  55         FM_MODE_TX,
  56         FM_MODE_RX,
  57         FM_MODE_ENTRY_MAX
  58 };
  59 
  60 #define FM_RX_RDS_INFO_FIELD_MAX        8       /* 4 Group * 2 Bytes */
  61 
  62 /* RX RDS data format */
  63 struct fm_rdsdata_format {
  64         union {
  65                 struct {
  66                         u8 buff[FM_RX_RDS_INFO_FIELD_MAX];
  67                 } groupdatabuff;
  68                 struct {
  69                         u16 pidata;
  70                         u8 blk_b[2];
  71                         u8 blk_c[2];
  72                         u8 blk_d[2];
  73                 } groupgeneral;
  74                 struct {
  75                         u16 pidata;
  76                         u8 blk_b[2];
  77                         u8 af[2];
  78                         u8 ps[2];
  79                 } group0A;
  80                 struct {
  81                         u16 pi[2];
  82                         u8 blk_b[2];
  83                         u8 ps[2];
  84                 } group0B;
  85         } data;
  86 };
  87 
  88 /* FM region (Europe/US, Japan) info */
  89 struct region_info {
  90         u32 chanl_space;
  91         u32 bot_freq;
  92         u32 top_freq;
  93         u8 fm_band;
  94 };
  95 struct fmdev;
  96 typedef void (*int_handler_prototype) (struct fmdev *);
  97 
  98 /* FM Interrupt processing related info */
  99 struct fm_irq {
 100         u8 stage;
 101         u16 flag;       /* FM interrupt flag */
 102         u16 mask;       /* FM interrupt mask */
 103         /* Interrupt process timeout handler */
 104         struct timer_list timer;
 105         u8 retry;
 106         int_handler_prototype *handlers;
 107 };
 108 
 109 /* RDS info */
 110 struct fm_rds {
 111         u8 flag;        /* RX RDS on/off status */
 112         u8 last_blk_idx;        /* Last received RDS block */
 113 
 114         /* RDS buffer */
 115         wait_queue_head_t read_queue;
 116         u32 buf_size;   /* Size is always multiple of 3 */
 117         u32 wr_idx;
 118         u32 rd_idx;
 119         u8 *buff;
 120 };
 121 
 122 #define FM_RDS_MAX_AF_LIST              25
 123 
 124 /*
 125  * Current RX channel Alternate Frequency cache.
 126  * This info is used to switch to other freq (AF)
 127  * when current channel signal strength is below RSSI threshold.
 128  */
 129 struct tuned_station_info {
 130         u16 picode;
 131         u32 af_cache[FM_RDS_MAX_AF_LIST];
 132         u8 afcache_size;
 133         u8 af_list_max;
 134 };
 135 
 136 /* FM RX mode info */
 137 struct fm_rx {
 138         struct region_info region;      /* Current selected band */
 139         u32 freq;       /* Current RX frquency */
 140         u8 mute_mode;   /* Current mute mode */
 141         u8 deemphasis_mode; /* Current deemphasis mode */
 142         /* RF dependent soft mute mode */
 143         u8 rf_depend_mute;
 144         u16 volume;     /* Current volume level */
 145         u16 rssi_threshold;     /* Current RSSI threshold level */
 146         /* Holds the index of the current AF jump */
 147         u8 afjump_idx;
 148         /* Will hold the frequency before the jump */
 149         u32 freq_before_jump;
 150         u8 rds_mode;    /* RDS operation mode (RDS/RDBS) */
 151         u8 af_mode;     /* Alternate frequency on/off */
 152         struct tuned_station_info stat_info;
 153         struct fm_rds rds;
 154 };
 155 
 156 #define FMTX_RDS_TXT_STR_SIZE   25
 157 /*
 158  * FM TX RDS data
 159  *
 160  * @ text_type: is the text following PS or RT
 161  * @ text: radio text string which could either be PS or RT
 162  * @ af_freq: alternate frequency for Tx
 163  * TODO: to be declared in application
 164  */
 165 struct tx_rds {
 166         u8 text_type;
 167         u8 text[FMTX_RDS_TXT_STR_SIZE];
 168         u8 flag;
 169         u32 af_freq;
 170 };
 171 /*
 172  * FM TX global data
 173  *
 174  * @ pwr_lvl: Power Level of the Transmission from mixer control
 175  * @ xmit_state: Transmission state = Updated locally upon Start/Stop
 176  * @ audio_io: i2S/Analog
 177  * @ tx_frq: Transmission frequency
 178  */
 179 struct fmtx_data {
 180         u8 pwr_lvl;
 181         u8 xmit_state;
 182         u8 audio_io;
 183         u8 region;
 184         u16 aud_mode;
 185         u32 preemph;
 186         u32 tx_frq;
 187         struct tx_rds rds;
 188 };
 189 
 190 /* FM driver operation structure */
 191 struct fmdev {
 192         struct video_device *radio_dev; /* V4L2 video device pointer */
 193         struct v4l2_device v4l2_dev;    /* V4L2 top level struct */
 194         struct snd_card *card;  /* Card which holds FM mixer controls */
 195         u16 asci_id;
 196         spinlock_t rds_buff_lock; /* To protect access to RDS buffer */
 197         spinlock_t resp_skb_lock; /* To protect access to received SKB */
 198 
 199         long flag;              /*  FM driver state machine info */
 200         int streg_cbdata; /* status of ST registration */
 201 
 202         struct sk_buff_head rx_q;       /* RX queue */
 203         struct tasklet_struct rx_task;  /* RX Tasklet */
 204 
 205         struct sk_buff_head tx_q;       /* TX queue */
 206         struct tasklet_struct tx_task;  /* TX Tasklet */
 207         unsigned long last_tx_jiffies;  /* Timestamp of last pkt sent */
 208         atomic_t tx_cnt;        /* Number of packets can send at a time */
 209 
 210         struct sk_buff *resp_skb;       /* Response from the chip */
 211         /* Main task completion handler */
 212         struct completion maintask_comp;
 213         /* Opcode of last command sent to the chip */
 214         u8 pre_op;
 215         /* Handler used for wakeup when response packet is received */
 216         struct completion *resp_comp;
 217         struct fm_irq irq_info;
 218         u8 curr_fmmode; /* Current FM chip mode (TX, RX, OFF) */
 219         struct fm_rx rx;        /* FM receiver info */
 220         struct fmtx_data tx_data;
 221 
 222         /* V4L2 ctrl framework handler*/
 223         struct v4l2_ctrl_handler ctrl_handler;
 224 
 225         /* For core assisted locking */
 226         struct mutex mutex;
 227 };
 228 #endif

/* [<][>][^][v][top][bottom][index][help] */