cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fmdrv.h (5763B)


      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
     53enum {
     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 */
     63struct 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 */
     89struct region_info {
     90	u32 chanl_space;
     91	u32 bot_freq;
     92	u32 top_freq;
     93	u8 fm_band;
     94};
     95struct fmdev;
     96typedef void (*int_handler_prototype) (struct fmdev *);
     97
     98/* FM Interrupt processing related info */
     99struct 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 */
    110struct 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 */
    129struct 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 */
    137struct 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 */
    165struct 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 */
    179struct 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 */
    191struct 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