blob: 99432878ee3e3182d4a0335ee73ba9855314df4e [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001#ifndef __LINUX_TAVARUA_H
2#define __LINUX_TAVARUA_H
3
4#ifdef __KERNEL__
5#include <linux/types.h>
6#include <asm/sizes.h>
7#else
8#include <stdint.h>
9#endif
10#include <linux/ioctl.h>
11#include <linux/videodev2.h>
12
13
14#undef FM_DEBUG
15
16/* constants */
17#define RDS_BLOCKS_NUM (4)
18#define BYTES_PER_BLOCK (3)
19#define MAX_PS_LENGTH (96)
20#define MAX_RT_LENGTH (64)
21
22#define XFRDAT0 (0x20)
23#define XFRDAT1 (0x21)
24#define XFRDAT2 (0x22)
25
26#define INTDET_PEEK_MSB (0x88)
27#define INTDET_PEEK_LSB (0x26)
28
29#define RMSSI_PEEK_MSB (0x88)
30#define RMSSI_PEEK_LSB (0xA8)
31
32#define MPX_DCC_BYPASS_POKE_MSB (0x88)
33#define MPX_DCC_BYPASS_POKE_LSB (0xC0)
34
35#define MPX_DCC_PEEK_MSB_REG1 (0x88)
36#define MPX_DCC_PEEK_LSB_REG1 (0xC2)
37
38#define MPX_DCC_PEEK_MSB_REG2 (0x88)
39#define MPX_DCC_PEEK_LSB_REG2 (0xC3)
40
41#define MPX_DCC_PEEK_MSB_REG3 (0x88)
42#define MPX_DCC_PEEK_LSB_REG3 (0xC4)
43
Anantha Krishnanbdb128c2011-11-21 17:51:26 +053044#define ON_CHANNEL_TH_MSB (0x0B)
45#define ON_CHANNEL_TH_LSB (0xA8)
46
47#define OFF_CHANNEL_TH_MSB (0x0B)
48#define OFF_CHANNEL_TH_LSB (0xAC)
49
Anantha Krishnana02ef212011-06-28 00:57:25 +053050#define ENF_200Khz (1)
51#define SRCH200KHZ_OFFSET (7)
52#define SRCH_MASK (1 << SRCH200KHZ_OFFSET)
53
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070054/* Standard buffer size */
Venkateshwarlu Domakonda00c882d2012-04-12 10:50:53 +053055#define STD_BUF_SIZE (128)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070056/* Search direction */
57#define SRCH_DIR_UP (0)
58#define SRCH_DIR_DOWN (1)
59
60/* control options */
61#define CTRL_ON (1)
62#define CTRL_OFF (0)
63
64#define US_LOW_BAND (87.5)
65#define US_HIGH_BAND (108)
66
67/* constant for Tx */
68
69#define MASK_PI (0x0000FFFF)
70#define MASK_PI_MSB (0x0000FF00)
71#define MASK_PI_LSB (0x000000FF)
72#define MASK_PTY (0x0000001F)
73#define MASK_TXREPCOUNT (0x0000000F)
74
75#undef FMDBG
76#ifdef FM_DEBUG
77 #define FMDBG(fmt, args...) printk(KERN_INFO "tavarua_radio: " fmt, ##args)
78#else
79 #define FMDBG(fmt, args...)
80#endif
81
82#undef FMDERR
83#define FMDERR(fmt, args...) printk(KERN_INFO "tavarua_radio: " fmt, ##args)
84
85#undef FMDBG_I2C
86#ifdef FM_DEBUG_I2C
87 #define FMDBG_I2C(fmt, args...) printk(KERN_INFO "fm_i2c: " fmt, ##args)
88#else
89 #define FMDBG_I2C(fmt, args...)
90#endif
91
92/* function declarations */
93/* FM Core audio paths. */
94#define TAVARUA_AUDIO_OUT_ANALOG_OFF (0)
95#define TAVARUA_AUDIO_OUT_ANALOG_ON (1)
96#define TAVARUA_AUDIO_OUT_DIGITAL_OFF (0)
97#define TAVARUA_AUDIO_OUT_DIGITAL_ON (1)
98
99int tavarua_set_audio_path(int digital_on, int analog_on);
100
101/* defines and enums*/
102
103#define MARIMBA_A0 0x01010013
104#define MARIMBA_2_1 0x02010204
105#define BAHAMA_1_0 0x0302010A
106#define BAHAMA_2_0 0x04020205
107#define WAIT_TIMEOUT 2000
108#define RADIO_INIT_TIME 15
109#define TAVARUA_DELAY 10
110/*
111 * The frequency is set in units of 62.5 Hz when using V4L2_TUNER_CAP_LOW,
112 * 62.5 kHz otherwise.
113 * The tuner is able to have a channel spacing of 50, 100 or 200 kHz.
114 * tuner->capability is therefore set to V4L2_TUNER_CAP_LOW
115 * The FREQ_MUL is then: 1 MHz / 62.5 Hz = 16000
116 */
117#define FREQ_MUL (1000000 / 62.5)
118
119enum v4l2_cid_private_tavarua_t {
120 V4L2_CID_PRIVATE_TAVARUA_SRCHMODE = (V4L2_CID_PRIVATE_BASE + 1),
121 V4L2_CID_PRIVATE_TAVARUA_SCANDWELL,
122 V4L2_CID_PRIVATE_TAVARUA_SRCHON,
123 V4L2_CID_PRIVATE_TAVARUA_STATE,
124 V4L2_CID_PRIVATE_TAVARUA_TRANSMIT_MODE,
125 V4L2_CID_PRIVATE_TAVARUA_RDSGROUP_MASK,
126 V4L2_CID_PRIVATE_TAVARUA_REGION,
127 V4L2_CID_PRIVATE_TAVARUA_SIGNAL_TH,
128 V4L2_CID_PRIVATE_TAVARUA_SRCH_PTY,
129 V4L2_CID_PRIVATE_TAVARUA_SRCH_PI,
130 V4L2_CID_PRIVATE_TAVARUA_SRCH_CNT,
131 V4L2_CID_PRIVATE_TAVARUA_EMPHASIS,
132 V4L2_CID_PRIVATE_TAVARUA_RDS_STD,
133 V4L2_CID_PRIVATE_TAVARUA_SPACING,
134 V4L2_CID_PRIVATE_TAVARUA_RDSON,
135 V4L2_CID_PRIVATE_TAVARUA_RDSGROUP_PROC,
136 V4L2_CID_PRIVATE_TAVARUA_LP_MODE,
137 V4L2_CID_PRIVATE_TAVARUA_ANTENNA,
138 V4L2_CID_PRIVATE_TAVARUA_RDSD_BUF,
139 V4L2_CID_PRIVATE_TAVARUA_PSALL,
140 /*v4l2 Tx controls*/
141 V4L2_CID_PRIVATE_TAVARUA_TX_SETPSREPEATCOUNT,
142 V4L2_CID_PRIVATE_TAVARUA_STOP_RDS_TX_PS_NAME,
143 V4L2_CID_PRIVATE_TAVARUA_STOP_RDS_TX_RT,
144 V4L2_CID_PRIVATE_TAVARUA_IOVERC,
145 V4L2_CID_PRIVATE_TAVARUA_INTDET,
146 V4L2_CID_PRIVATE_TAVARUA_MPX_DCC,
Anantha Krishnane46ef6f2011-06-29 23:56:03 +0530147 V4L2_CID_PRIVATE_TAVARUA_AF_JUMP,
Anantha Krishnanf2258602011-06-30 01:32:09 +0530148 V4L2_CID_PRIVATE_TAVARUA_RSSI_DELTA,
Srinivasa Rao Uppala4e38bfc2011-09-15 16:00:31 +0530149 V4L2_CID_PRIVATE_TAVARUA_HLSI,
Anantha Krishnan71d6fa62011-12-13 19:30:51 +0530150
Srinivasa Rao Uppala4e38bfc2011-09-15 16:00:31 +0530151 /*
Anantha Krishnan40bcd052011-12-05 15:28:29 +0530152 * Here we have IOCTl's that are specific to IRIS
Anantha Krishnan71d6fa62011-12-13 19:30:51 +0530153 * (V4L2_CID_PRIVATE_BASE + 0x1E to V4L2_CID_PRIVATE_BASE + 0x28)
Srinivasa Rao Uppala4e38bfc2011-09-15 16:00:31 +0530154 */
Anantha Krishnana3dcce42012-01-05 19:27:57 +0530155 V4L2_CID_PRIVATE_SOFT_MUTE,/* 0x800001E*/
Anantha Krishnan71d6fa62011-12-13 19:30:51 +0530156 V4L2_CID_PRIVATE_RIVA_ACCS_ADDR,
157 V4L2_CID_PRIVATE_RIVA_ACCS_LEN,
158 V4L2_CID_PRIVATE_RIVA_PEEK,
159 V4L2_CID_PRIVATE_RIVA_POKE,
160 V4L2_CID_PRIVATE_SSBI_ACCS_ADDR,
161 V4L2_CID_PRIVATE_SSBI_PEEK,
162 V4L2_CID_PRIVATE_SSBI_POKE,
163 V4L2_CID_PRIVATE_TX_TONE,
164 V4L2_CID_PRIVATE_RDS_GRP_COUNTERS,
Anantha Krishnana3dcce42012-01-05 19:27:57 +0530165 V4L2_CID_PRIVATE_SET_NOTCH_FILTER,/* 0x8000028 */
Anantha Krishnan71d6fa62011-12-13 19:30:51 +0530166
Anantha Krishnana3dcce42012-01-05 19:27:57 +0530167 V4L2_CID_PRIVATE_TAVARUA_SET_AUDIO_PATH,/* 0x8000029 */
168 V4L2_CID_PRIVATE_TAVARUA_DO_CALIBRATION,/* 0x800002A : IRIS */
169 V4L2_CID_PRIVATE_TAVARUA_SRCH_ALGORITHM,/* 0x800002B */
170 V4L2_CID_PRIVATE_IRIS_GET_SINR, /* 0x800002C : IRIS */
171 V4L2_CID_PRIVATE_INTF_LOW_THRESHOLD, /* 0x800002D */
172 V4L2_CID_PRIVATE_INTF_HIGH_THRESHOLD, /* 0x800002E */
173 V4L2_CID_PRIVATE_SINR_THRESHOLD, /* 0x800002F : IRIS */
174 V4L2_CID_PRIVATE_SINR_SAMPLES, /* 0x8000030 : IRIS */
Anantha Krishnan93eb1762012-06-04 13:41:07 +0530175 V4L2_CID_PRIVATE_SPUR_FREQ,
176 V4L2_CID_PRIVATE_SPUR_FREQ_RMSSI,
177 V4L2_CID_PRIVATE_SPUR_SELECTION,
178 V4L2_CID_PRIVATE_UPDATE_SPUR_TABLE,
Anantha Krishnanbdb128c2011-11-21 17:51:26 +0530179
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700180};
181
182enum tavarua_buf_t {
183 TAVARUA_BUF_SRCH_LIST,
184 TAVARUA_BUF_EVENTS,
185 TAVARUA_BUF_RT_RDS,
186 TAVARUA_BUF_PS_RDS,
187 TAVARUA_BUF_RAW_RDS,
188 TAVARUA_BUF_AF_LIST,
189 TAVARUA_BUF_MAX
190};
191
192enum tavarua_xfr_t {
193 TAVARUA_XFR_SYNC,
194 TAVARUA_XFR_ERROR,
195 TAVARUA_XFR_SRCH_LIST,
196 TAVARUA_XFR_RT_RDS,
197 TAVARUA_XFR_PS_RDS,
198 TAVARUA_XFR_AF_LIST,
199 TAVARUA_XFR_MAX
200};
201
Anantha Krishnana02ef212011-06-28 00:57:25 +0530202enum channel_spacing {
203 FM_CH_SPACE_200KHZ,
204 FM_CH_SPACE_100KHZ,
205 FM_CH_SPACE_50KHZ
206};
207
208enum step_size {
209 NO_SRCH200khz,
210 ENF_SRCH200khz
211};
212
213enum emphasis {
214 EMP_75,
215 EMP_50
216};
217
218enum rds_std {
219 RBDS_STD,
220 RDS_STD
221};
222
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700223/* offsets */
224#define RAW_RDS 0x0F
225#define RDS_BLOCK 3
226
227/* registers*/
228#define MARIMBA_XO_BUFF_CNTRL 0x07
229#define RADIO_REGISTERS 0x30
230#define XFR_REG_NUM 16
231#define STATUS_REG_NUM 3
232
233/* TX constants */
234#define HEADER_SIZE 4
235#define TX_ON 0x80
236#define TAVARUA_TX_RT RDS_RT_0
237#define TAVARUA_TX_PS RDS_PS_0
238
239enum register_t {
240 STATUS_REG1 = 0,
241 STATUS_REG2,
242 STATUS_REG3,
243 RDCTRL,
244 FREQ,
245 TUNECTRL,
246 SRCHRDS1,
247 SRCHRDS2,
248 SRCHCTRL,
249 IOCTRL,
250 RDSCTRL,
251 ADVCTRL,
252 AUDIOCTRL,
253 RMSSI,
254 IOVERC,
255 AUDIOIND = 0x1E,
256 XFRCTRL,
257 FM_CTL0 = 0xFF,
258 LEAKAGE_CNTRL = 0xFE,
259};
260#define BAHAMA_RBIAS_CTL1 0x07
261#define BAHAMA_FM_MODE_REG 0xFD
262#define BAHAMA_FM_CTL1_REG 0xFE
263#define BAHAMA_FM_CTL0_REG 0xFF
264#define BAHAMA_FM_MODE_NORMAL 0x00
265#define BAHAMA_LDO_DREG_CTL0 0xF0
266#define BAHAMA_LDO_AREG_CTL0 0xF4
267
268/* Radio Control */
269#define RDCTRL_STATE_OFFSET 0
270#define RDCTRL_STATE_MASK (3 << RDCTRL_STATE_OFFSET)
271#define RDCTRL_BAND_OFFSET 2
272#define RDCTRL_BAND_MASK (1 << RDCTRL_BAND_OFFSET)
273#define RDCTRL_CHSPACE_OFFSET 3
274#define RDCTRL_CHSPACE_MASK (3 << RDCTRL_CHSPACE_OFFSET)
275#define RDCTRL_DEEMPHASIS_OFFSET 5
276#define RDCTRL_DEEMPHASIS_MASK (1 << RDCTRL_DEEMPHASIS_OFFSET)
277#define RDCTRL_HLSI_OFFSET 6
278#define RDCTRL_HLSI_MASK (3 << RDCTRL_HLSI_OFFSET)
Anantha Krishnane46ef6f2011-06-29 23:56:03 +0530279#define RDSAF_OFFSET 6
280#define RDSAF_MASK (1 << RDSAF_OFFSET)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700281
282/* Tune Control */
283#define TUNE_STATION 0x01
284#define ADD_OFFSET (1 << 1)
285#define SIGSTATE (1 << 5)
286#define MOSTSTATE (1 << 6)
287#define RDSSYNC (1 << 7)
288/* Search Control */
289#define SRCH_MODE_OFFSET 0
290#define SRCH_MODE_MASK (7 << SRCH_MODE_OFFSET)
291#define SRCH_DIR_OFFSET 3
292#define SRCH_DIR_MASK (1 << SRCH_DIR_OFFSET)
293#define SRCH_DWELL_OFFSET 4
294#define SRCH_DWELL_MASK (7 << SRCH_DWELL_OFFSET)
295#define SRCH_STATE_OFFSET 7
296#define SRCH_STATE_MASK (1 << SRCH_STATE_OFFSET)
297
298/* I/O Control */
299#define IOC_HRD_MUTE 0x03
300#define IOC_SFT_MUTE (1 << 2)
301#define IOC_MON_STR (1 << 3)
302#define IOC_SIG_BLND (1 << 4)
303#define IOC_INTF_BLND (1 << 5)
304#define IOC_ANTENNA (1 << 6)
305#define IOC_ANTENNA_OFFSET 6
306#define IOC_ANTENNA_MASK (1 << IOC_ANTENNA_OFFSET)
307
308/* RDS Control */
309#define RDS_ON 0x01
310#define RDSCTRL_STANDARD_OFFSET 1
311#define RDSCTRL_STANDARD_MASK (1 << RDSCTRL_STANDARD_OFFSET)
312
313/* Advanced features controls */
314#define RDSRTEN (1 << 3)
315#define RDSPSEN (1 << 4)
316
317/* Audio path control */
318#define AUDIORX_ANALOG_OFFSET 0
319#define AUDIORX_ANALOG_MASK (1 << AUDIORX_ANALOG_OFFSET)
320#define AUDIORX_DIGITAL_OFFSET 1
321#define AUDIORX_DIGITAL_MASK (1 << AUDIORX_DIGITAL_OFFSET)
322#define AUDIOTX_OFFSET 2
323#define AUDIOTX_MASK (1 << AUDIOTX_OFFSET)
324#define I2SCTRL_OFFSET 3
325#define I2SCTRL_MASK (1 << I2SCTRL_OFFSET)
326
327/* Search options */
328enum search_t {
329 SEEK,
330 SCAN,
331 SCAN_FOR_STRONG,
332 SCAN_FOR_WEAK,
333 RDS_SEEK_PTY,
334 RDS_SCAN_PTY,
335 RDS_SEEK_PI,
336 RDS_AF_JUMP,
337};
338
Anantha Krishnanc72725a2011-09-06 09:28:22 +0530339enum audio_path {
340 FM_DIGITAL_PATH,
341 FM_ANALOG_PATH
342};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700343#define SRCH_MODE 0x07
344#define SRCH_DIR 0x08 /* 0-up 1-down */
345#define SCAN_DWELL 0x70
346#define SRCH_ON 0x80
347
348/* RDS CONFIG */
349#define RDS_CONFIG_PSALL 0x01
350
351#define FM_ENABLE 0x22
352#define SET_REG_FIELD(reg, val, offset, mask) \
353 (reg = (reg & ~mask) | (((val) << offset) & mask))
354#define GET_REG_FIELD(reg, offset, mask) ((reg & mask) >> offset)
Anantha Krishnan29f1d932011-12-29 21:17:29 +0530355#define RSH_DATA(val, offset) ((val) >> (offset))
Anantha Krishnana3dcce42012-01-05 19:27:57 +0530356#define LSH_DATA(val, offset) ((val) << (offset))
Anantha Krishnan29f1d932011-12-29 21:17:29 +0530357#define GET_ABS_VAL(val) ((val) & (0xFF))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700358
359enum radio_state_t {
360 FM_OFF,
361 FM_RECV,
362 FM_TRANS,
363 FM_RESET,
364};
365
366#define XFRCTRL_WRITE (1 << 7)
367
368/* Interrupt status */
369
370/* interrupt register 1 */
371#define READY (1 << 0) /* Radio ready after powerup or reset */
372#define TUNE (1 << 1) /* Tune completed */
373#define SEARCH (1 << 2) /* Search completed (read FREQ) */
374#define SCANNEXT (1 << 3) /* Scanning for next station */
375#define SIGNAL (1 << 4) /* Signal indicator change (read SIGSTATE) */
376#define INTF (1 << 5) /* Interference cnt has fallen outside range */
377#define SYNC (1 << 6) /* RDS sync state change (read RDSSYNC) */
378#define AUDIO (1 << 7) /* Audio Control indicator (read AUDIOIND) */
379
380/* interrupt register 2 */
381#define RDSDAT (1 << 0) /* New unread RDS data group available */
382#define BLOCKB (1 << 1) /* Block-B match condition exists */
383#define PROGID (1 << 2) /* Block-A or Block-C matched stored PI value*/
384#define RDSPS (1 << 3) /* New RDS Program Service Table available */
385#define RDSRT (1 << 4) /* New RDS Radio Text available */
386#define RDSAF (1 << 5) /* New RDS AF List available */
387#define TXRDSDAT (1 << 6) /* Transmitted an RDS group */
388#define TXRDSDONE (1 << 7) /* RDS raw group one-shot transmit completed */
389
390/* interrupt register 3 */
391#define TRANSFER (1 << 0) /* Data transfer (XFR) completed */
392#define RDSPROC (1 << 1) /* Dynamic RDS Processing complete */
393#define ERROR (1 << 7) /* Err occurred.Read code to determine cause */
394
395
396#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
397#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
398/* Transfer */
399enum tavarua_xfr_ctrl_t {
400 RDS_PS_0 = 0x01,
401 RDS_PS_1,
402 RDS_PS_2,
403 RDS_PS_3,
404 RDS_PS_4,
405 RDS_PS_5,
406 RDS_PS_6,
407 RDS_RT_0,
408 RDS_RT_1,
409 RDS_RT_2,
410 RDS_RT_3,
411 RDS_RT_4,
412 RDS_AF_0,
413 RDS_AF_1,
414 RDS_CONFIG,
415 RDS_TX_GROUPS,
416 RDS_COUNT_0,
417 RDS_COUNT_1,
418 RDS_COUNT_2,
419 RADIO_CONFIG,
420 RX_CONFIG,
421 RX_TIMERS,
422 RX_STATIONS_0,
423 RX_STATIONS_1,
424 INT_CTRL,
425 ERROR_CODE,
426 CHIPID,
427 CAL_DAT_0 = 0x20,
428 CAL_DAT_1,
429 CAL_DAT_2,
430 CAL_DAT_3,
431 CAL_CFG_0,
432 CAL_CFG_1,
433 DIG_INTF_0,
434 DIG_INTF_1,
435 DIG_AGC_0,
436 DIG_AGC_1,
437 DIG_AGC_2,
438 DIG_AUDIO_0,
439 DIG_AUDIO_1,
440 DIG_AUDIO_2,
441 DIG_AUDIO_3,
442 DIG_AUDIO_4,
443 DIG_RXRDS,
444 DIG_DCC,
445 DIG_SPUR,
446 DIG_MPXDCC,
447 DIG_PILOT,
448 DIG_DEMOD,
449 DIG_MOST,
450 DIG_TX_0,
451 DIG_TX_1,
452 PHY_TXGAIN = 0x3B,
453 PHY_CONFIG,
454 PHY_TXBLOCK,
455 PHY_TCB,
456 XFR_PEEK_MODE = 0x40,
457 XFR_POKE_MODE = 0xC0,
458 TAVARUA_XFR_CTRL_MAX
459};
460
461enum tavarua_evt_t {
462 TAVARUA_EVT_RADIO_READY,
463 TAVARUA_EVT_TUNE_SUCC,
464 TAVARUA_EVT_SEEK_COMPLETE,
465 TAVARUA_EVT_SCAN_NEXT,
466 TAVARUA_EVT_NEW_RAW_RDS,
467 TAVARUA_EVT_NEW_RT_RDS,
468 TAVARUA_EVT_NEW_PS_RDS,
469 TAVARUA_EVT_ERROR,
470 TAVARUA_EVT_BELOW_TH,
471 TAVARUA_EVT_ABOVE_TH,
472 TAVARUA_EVT_STEREO,
473 TAVARUA_EVT_MONO,
474 TAVARUA_EVT_RDS_AVAIL,
475 TAVARUA_EVT_RDS_NOT_AVAIL,
476 TAVARUA_EVT_NEW_SRCH_LIST,
477 TAVARUA_EVT_NEW_AF_LIST,
478 TAVARUA_EVT_TXRDSDAT,
Ayaz Ahmad0fa19842012-03-14 22:54:53 +0530479 TAVARUA_EVT_TXRDSDONE,
480 TAVARUA_EVT_RADIO_DISABLED
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700481};
482
483enum tavarua_region_t {
484 TAVARUA_REGION_US,
485 TAVARUA_REGION_EU,
486 TAVARUA_REGION_JAPAN,
487 TAVARUA_REGION_JAPAN_WIDE,
488 TAVARUA_REGION_OTHER
489};
490
Anantha Krishnan93eb1762012-06-04 13:41:07 +0530491enum {
492 ONE_BYTE = 1,
493 TWO_BYTE,
494 THREE_BYTE,
495 FOUR_BYTE,
496 FIVE_BYTE,
497 SIX_BYTE,
498 SEVEN_BYTE,
499 EIGHT_BYTE,
500 NINE_BYTE,
501 TEN_BYTE,
502 ELEVEN_BYTE,
503 TWELVE_BYTE,
504 THIRTEEN_BYTE
505};
506#define XFR_READ (0)
507#define XFR_WRITE (1)
508#define XFR_MODE_OFFSET (0)
509#define XFR_ADDR_MSB_OFFSET (1)
510#define XFR_ADDR_LSB_OFFSET (2)
511#define XFR_DATA_OFFSET (3)
512#define SPUR_DATA_SIZE (3)
513#define MAX_SPUR_FREQ_LIMIT (30)
514#define READ_COMPLETE (0x20)
515#define SPUR_TABLE_ADDR (0x0BB7)
516#define SPUR_TABLE_START_ADDR (SPUR_TABLE_ADDR + 1)
517#define XFR_PEEK_COMPLETE (XFR_PEEK_MODE | READ_COMPLETE)
518#define XFR_POKE_COMPLETE (XFR_POKE_MODE)
519
520#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
521#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
522
523struct fm_spur_data {
524 int freq[MAX_SPUR_FREQ_LIMIT];
525 __s8 rmssi[MAX_SPUR_FREQ_LIMIT];
526} __packed;
527
528struct fm_def_data_wr_req {
529 __u8 mode;
530 __u8 length;
531 __u8 data[XFR_REG_NUM];
532} __packed;
533
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700534#endif /* __LINUX_TAVARUA_H */