MT6620: add the new driver JB2 V1.0
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_combo / drv_fm / inc / fm_link.h
1 #ifndef __FM_LINK_H__
2 #define __FM_LINK_H__
3
4 #include "fm_typedef.h"
5 #include "fm_rds.h"
6
7 typedef enum {
8     FM_TASK_RX_PARSER_PKT_TYPE = 0,
9     FM_TASK_RX_PARSER_OPCODE,
10     FM_TASK_RX_PARSER_PKT_LEN_1,
11     FM_TASK_RX_PARSER_PKT_LEN_2,
12     FM_TASK_RX_PARSER_PKT_PAYLOAD,
13     FM_TASK_RX_PARSER_BUFFER_CONGESTION
14 } fm_task_parser_state;
15
16 enum {
17     FM_TASK_COMMAND_PKT_TYPE = 0x01,
18     FM_TASK_EVENT_PKT_TYPE = 0x04
19 };
20
21 enum {
22     FM_STP_TEST_OPCODE      = 0x00,
23     FSPI_ENABLE_OPCODE      = 0x01,
24     FSPI_MUX_SEL_OPCODE     = 0x02,
25     FSPI_READ_OPCODE        = 0x03,
26     FSPI_WRITE_OPCODE       = 0x04,
27     FI2C_READ_OPCODE        = 0x05,
28     FI2C_WRITE_OPCODE       = 0x06,
29     FM_ENABLE_OPCODE        = 0x07,
30     FM_RESET_OPCODE         = 0x08,
31     FM_TUNE_OPCODE          = 0x09,
32     FM_SEEK_OPCODE          = 0x0a,
33     FM_SCAN_OPCODE          = 0x0b,
34     RDS_RX_ENABLE_OPCODE    = 0x0c,
35     RDS_RX_DATA_OPCODE      = 0x0d,
36     FM_RAMPDOWN_OPCODE      = 0x0e,
37     FM_MCUCLK_SEL_OPCODE    = 0x0f,
38     FM_MODEMCLK_SEL_OPCODE  = 0x10,
39     RDS_TX_OPCODE           = 0x11,
40     FM_PATCH_DOWNLOAD_OPCODE = 0x12,
41     FM_COEFF_DOWNLOAD_OPCODE = 0x13,
42     FM_HWCOEFF_DOWNLOAD_OPCODE = 0x14,
43     FM_ROM_DOWNLOAD_OPCODE = 0x15,
44     FM_SOFT_MUTE_TUNE_OPCODE = 0x17,
45 };
46
47 enum {
48     FLAG_TEST = (1 << FM_STP_TEST_OPCODE),
49     FLAG_FSPI_EN = (1 << FSPI_ENABLE_OPCODE),
50     FLAG_FSPI_MUXSEL = (1 << FSPI_MUX_SEL_OPCODE),
51     FLAG_FSPI_RD = (1 << FSPI_READ_OPCODE),
52     FLAG_FSPI_WR = (1 << FSPI_WRITE_OPCODE),
53     FLAG_I2C_RD = (1 << FI2C_READ_OPCODE),
54     FLAG_I2C_WR = (1 << FI2C_WRITE_OPCODE),
55     FLAG_EN = (1 << FM_ENABLE_OPCODE),
56     FLAG_RST = (1 << FM_RESET_OPCODE),
57     FLAG_TUNE = (1 << FM_TUNE_OPCODE),
58     FLAG_SEEK = (1 << FM_SEEK_OPCODE),
59     FLAG_SCAN = (1 << FM_SCAN_OPCODE),
60     FLAG_RDS_RX_EN = (1 << RDS_RX_ENABLE_OPCODE),
61     FLAG_RDS_DATA = (1 << RDS_RX_DATA_OPCODE),
62     FLAG_RAMPDOWN = (1 << FM_RAMPDOWN_OPCODE),
63     FLAG_MCUCLK = (1 << FM_MCUCLK_SEL_OPCODE),
64     FLAG_MODEMCLK = (1 << FM_MODEMCLK_SEL_OPCODE),
65     FLAG_RDS_TX = (1 << RDS_TX_OPCODE),
66     FLAG_PATCH = (1 << FM_PATCH_DOWNLOAD_OPCODE),
67     FLAG_COEFF = (1 << FM_COEFF_DOWNLOAD_OPCODE),
68     FLAG_HWCOEFF = (1 << FM_HWCOEFF_DOWNLOAD_OPCODE),
69     FLAG_ROM = (1 << FM_ROM_DOWNLOAD_OPCODE),
70     FLAG_SM_TUNE = (1 << FM_SOFT_MUTE_TUNE_OPCODE), // 23
71     FLAG_CQI_DONE = (1 << 27),
72     FLAG_TUNE_DONE = (1 << 28),
73     FLAG_SEEK_DONE = (1 << 29),
74     FLAG_SCAN_DONE = (1 << 30),
75     FLAG_TERMINATE = (1 << 31)
76 };
77
78 #define FM_SCANTBL_SIZE  16
79 #define FM_CQI_BUF_SIZE  96
80 struct fm_res_ctx {
81     fm_u16 fspi_rd;
82     fm_u16 seek_result;
83     fm_u16 scan_result[FM_SCANTBL_SIZE];
84     fm_s8 cqi[FM_CQI_BUF_SIZE];
85     struct rds_rx_t rds_rx_result;
86 };
87
88 #define FM_TRACE_ENABLE
89
90 #define FM_TRACE_FIFO_SIZE 200
91 #define FM_TRACE_PKT_SIZE 60
92 struct fm_trace_t {
93     fm_s32 type;
94     fm_s32 opcode;
95     fm_s32 len;
96     fm_u8 pkt[FM_TRACE_PKT_SIZE]; // full packet
97     unsigned long time;
98     fm_s32 tid;
99 };
100
101 struct fm_trace_fifo_t {
102     fm_s8 name[20+1];
103     struct fm_trace_t trace[FM_TRACE_FIFO_SIZE];
104     fm_u32 size;
105     fm_u32 in;
106     fm_u32 out;
107     fm_u32 len;
108     fm_s32 (*trace_in)(struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra);
109     fm_s32 (*trace_out)(struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra);
110     fm_bool (*is_full)(struct fm_trace_fifo_t *thiz);
111     fm_bool (*is_empty)(struct fm_trace_fifo_t *thiz);
112 };
113
114 #define FM_TRACE_IN(fifop, tracep)  \
115 ({                                    \
116     fm_s32 __ret = (fm_s32)0;              \
117     if(fifop && (fifop)->trace_in){          \
118         __ret = (fifop)->trace_in(fifop, tracep);   \
119     }                               \
120     __ret;                          \
121 })
122
123 #define FM_TRACE_OUT(fifop, tracep)  \
124 ({                                    \
125     fm_s32 __ret = (fm_s32)0;              \
126     if(fifop && (fifop)->trace_out){          \
127         __ret = (fifop)->trace_out(fifop, tracep);   \
128     }                               \
129     __ret;                          \
130 })
131
132 #define FM_TRACE_FULL(fifop)  \
133 ({                                    \
134     fm_bool __ret = (fm_bool)fm_false;      \
135     if(fifop && (fifop)->is_full){          \
136         __ret = (fifop)->is_full(fifop);   \
137     }                               \
138     __ret;                          \
139 })
140
141 #define FM_TRACE_EMPTY(fifop)  \
142 ({                                    \
143     fm_bool __ret = (fm_bool)fm_false;      \
144     if(fifop && (fifop)->is_empty){          \
145         __ret = (fifop)->is_empty(fifop);   \
146     }                               \
147     __ret;                          \
148 })
149
150 #if (defined(MT6620_FM)||defined(MT6628_FM))
151 #include "fm_utils.h"
152
153 #define RX_BUF_SIZE 128
154 #define TX_BUF_SIZE 1024
155
156 #define SW_RETRY_CNT            (1)
157 #define SW_RETRY_CNT_MAX        (5)
158 #define SW_WAIT_TIMEOUT_MAX     (100)
159 // FM operation timeout define for error handle
160 #define TEST_TIMEOUT            (3)
161 #define FSPI_EN_TIMEOUT         (3)
162 #define FSPI_MUXSEL_TIMEOUT     (3)
163 #define FSPI_RD_TIMEOUT         (3)
164 #define FSPI_WR_TIMEOUT         (3)
165 #define I2C_RD_TIMEOUT          (3)
166 #define I2C_WR_TIMEOUT          (3)
167 #define EN_TIMEOUT              (3)
168 #define RST_TIMEOUT             (3)
169 #define TUNE_TIMEOUT            (3)
170 #define SM_TUNE_TIMEOUT         (6)
171 #define SEEK_TIMEOUT            (15)
172 #define SCAN_TIMEOUT            (15) //usualy scan will cost 10 seconds 
173 #define RDS_RX_EN_TIMEOUT       (3)
174 #define RDS_DATA_TIMEOUT        (100)
175 #define RAMPDOWN_TIMEOUT        (3)
176 #define MCUCLK_TIMEOUT          (3)
177 #define MODEMCLK_TIMEOUT        (3)
178 #define RDS_TX_TIMEOUT          (3)
179 #define PATCH_TIMEOUT           (3)
180 #define COEFF_TIMEOUT           (3)
181 #define HWCOEFF_TIMEOUT         (3)
182 #define ROM_TIMEOUT             (3)
183
184 struct fm_link_event {
185         struct fm_flag_event *ln_event;
186         struct fm_res_ctx result; // seek/scan/read/RDS
187 };
188 #endif
189
190 /*
191  * FM data and ctrl link APIs: platform related and bus related
192  */
193 extern fm_s32 fm_link_setup(void* data);
194
195 extern fm_s32 fm_link_release(void);
196
197 extern fm_s32 fm_cmd_tx(fm_u8* buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, fm_s32(*callback)(struct fm_res_ctx* result));
198
199 extern fm_s32 fm_event_parser(fm_s32(*rds_parser)(struct rds_rx_t*, fm_s32));
200
201 extern fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val);
202
203 extern fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val);
204
205 extern fm_s32 fm_force_active_event(fm_u32 mask);
206
207 extern fm_bool fm_wait_stc_done(fm_u32 sec);
208
209 extern struct fm_trace_fifo_t* fm_trace_fifo_create(const fm_s8 *name);
210
211 extern fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo);
212
213 extern fm_s32 fm_print_cmd_fifo(void);
214
215 extern fm_s32 fm_print_evt_fifo(void);
216
217 #endif //__FM_LINK_H__
218