blob: 381f5c48e55a2d72c922016c870f14c38184efb1 [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 */
55#define STD_BUF_SIZE (64)
56/* 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 Krishnanbdb128c2011-11-21 17:51:26 +0530175
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700176};
177
178enum tavarua_buf_t {
179 TAVARUA_BUF_SRCH_LIST,
180 TAVARUA_BUF_EVENTS,
181 TAVARUA_BUF_RT_RDS,
182 TAVARUA_BUF_PS_RDS,
183 TAVARUA_BUF_RAW_RDS,
184 TAVARUA_BUF_AF_LIST,
185 TAVARUA_BUF_MAX
186};
187
188enum tavarua_xfr_t {
189 TAVARUA_XFR_SYNC,
190 TAVARUA_XFR_ERROR,
191 TAVARUA_XFR_SRCH_LIST,
192 TAVARUA_XFR_RT_RDS,
193 TAVARUA_XFR_PS_RDS,
194 TAVARUA_XFR_AF_LIST,
195 TAVARUA_XFR_MAX
196};
197
Anantha Krishnana02ef212011-06-28 00:57:25 +0530198enum channel_spacing {
199 FM_CH_SPACE_200KHZ,
200 FM_CH_SPACE_100KHZ,
201 FM_CH_SPACE_50KHZ
202};
203
204enum step_size {
205 NO_SRCH200khz,
206 ENF_SRCH200khz
207};
208
209enum emphasis {
210 EMP_75,
211 EMP_50
212};
213
214enum rds_std {
215 RBDS_STD,
216 RDS_STD
217};
218
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700219/* offsets */
220#define RAW_RDS 0x0F
221#define RDS_BLOCK 3
222
223/* registers*/
224#define MARIMBA_XO_BUFF_CNTRL 0x07
225#define RADIO_REGISTERS 0x30
226#define XFR_REG_NUM 16
227#define STATUS_REG_NUM 3
228
229/* TX constants */
230#define HEADER_SIZE 4
231#define TX_ON 0x80
232#define TAVARUA_TX_RT RDS_RT_0
233#define TAVARUA_TX_PS RDS_PS_0
234
235enum register_t {
236 STATUS_REG1 = 0,
237 STATUS_REG2,
238 STATUS_REG3,
239 RDCTRL,
240 FREQ,
241 TUNECTRL,
242 SRCHRDS1,
243 SRCHRDS2,
244 SRCHCTRL,
245 IOCTRL,
246 RDSCTRL,
247 ADVCTRL,
248 AUDIOCTRL,
249 RMSSI,
250 IOVERC,
251 AUDIOIND = 0x1E,
252 XFRCTRL,
253 FM_CTL0 = 0xFF,
254 LEAKAGE_CNTRL = 0xFE,
255};
256#define BAHAMA_RBIAS_CTL1 0x07
257#define BAHAMA_FM_MODE_REG 0xFD
258#define BAHAMA_FM_CTL1_REG 0xFE
259#define BAHAMA_FM_CTL0_REG 0xFF
260#define BAHAMA_FM_MODE_NORMAL 0x00
261#define BAHAMA_LDO_DREG_CTL0 0xF0
262#define BAHAMA_LDO_AREG_CTL0 0xF4
263
264/* Radio Control */
265#define RDCTRL_STATE_OFFSET 0
266#define RDCTRL_STATE_MASK (3 << RDCTRL_STATE_OFFSET)
267#define RDCTRL_BAND_OFFSET 2
268#define RDCTRL_BAND_MASK (1 << RDCTRL_BAND_OFFSET)
269#define RDCTRL_CHSPACE_OFFSET 3
270#define RDCTRL_CHSPACE_MASK (3 << RDCTRL_CHSPACE_OFFSET)
271#define RDCTRL_DEEMPHASIS_OFFSET 5
272#define RDCTRL_DEEMPHASIS_MASK (1 << RDCTRL_DEEMPHASIS_OFFSET)
273#define RDCTRL_HLSI_OFFSET 6
274#define RDCTRL_HLSI_MASK (3 << RDCTRL_HLSI_OFFSET)
Anantha Krishnane46ef6f2011-06-29 23:56:03 +0530275#define RDSAF_OFFSET 6
276#define RDSAF_MASK (1 << RDSAF_OFFSET)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700277
278/* Tune Control */
279#define TUNE_STATION 0x01
280#define ADD_OFFSET (1 << 1)
281#define SIGSTATE (1 << 5)
282#define MOSTSTATE (1 << 6)
283#define RDSSYNC (1 << 7)
284/* Search Control */
285#define SRCH_MODE_OFFSET 0
286#define SRCH_MODE_MASK (7 << SRCH_MODE_OFFSET)
287#define SRCH_DIR_OFFSET 3
288#define SRCH_DIR_MASK (1 << SRCH_DIR_OFFSET)
289#define SRCH_DWELL_OFFSET 4
290#define SRCH_DWELL_MASK (7 << SRCH_DWELL_OFFSET)
291#define SRCH_STATE_OFFSET 7
292#define SRCH_STATE_MASK (1 << SRCH_STATE_OFFSET)
293
294/* I/O Control */
295#define IOC_HRD_MUTE 0x03
296#define IOC_SFT_MUTE (1 << 2)
297#define IOC_MON_STR (1 << 3)
298#define IOC_SIG_BLND (1 << 4)
299#define IOC_INTF_BLND (1 << 5)
300#define IOC_ANTENNA (1 << 6)
301#define IOC_ANTENNA_OFFSET 6
302#define IOC_ANTENNA_MASK (1 << IOC_ANTENNA_OFFSET)
303
304/* RDS Control */
305#define RDS_ON 0x01
306#define RDSCTRL_STANDARD_OFFSET 1
307#define RDSCTRL_STANDARD_MASK (1 << RDSCTRL_STANDARD_OFFSET)
308
309/* Advanced features controls */
310#define RDSRTEN (1 << 3)
311#define RDSPSEN (1 << 4)
312
313/* Audio path control */
314#define AUDIORX_ANALOG_OFFSET 0
315#define AUDIORX_ANALOG_MASK (1 << AUDIORX_ANALOG_OFFSET)
316#define AUDIORX_DIGITAL_OFFSET 1
317#define AUDIORX_DIGITAL_MASK (1 << AUDIORX_DIGITAL_OFFSET)
318#define AUDIOTX_OFFSET 2
319#define AUDIOTX_MASK (1 << AUDIOTX_OFFSET)
320#define I2SCTRL_OFFSET 3
321#define I2SCTRL_MASK (1 << I2SCTRL_OFFSET)
322
323/* Search options */
324enum search_t {
325 SEEK,
326 SCAN,
327 SCAN_FOR_STRONG,
328 SCAN_FOR_WEAK,
329 RDS_SEEK_PTY,
330 RDS_SCAN_PTY,
331 RDS_SEEK_PI,
332 RDS_AF_JUMP,
333};
334
Anantha Krishnanc72725a2011-09-06 09:28:22 +0530335enum audio_path {
336 FM_DIGITAL_PATH,
337 FM_ANALOG_PATH
338};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700339#define SRCH_MODE 0x07
340#define SRCH_DIR 0x08 /* 0-up 1-down */
341#define SCAN_DWELL 0x70
342#define SRCH_ON 0x80
343
344/* RDS CONFIG */
345#define RDS_CONFIG_PSALL 0x01
346
347#define FM_ENABLE 0x22
348#define SET_REG_FIELD(reg, val, offset, mask) \
349 (reg = (reg & ~mask) | (((val) << offset) & mask))
350#define GET_REG_FIELD(reg, offset, mask) ((reg & mask) >> offset)
Anantha Krishnan29f1d932011-12-29 21:17:29 +0530351#define RSH_DATA(val, offset) ((val) >> (offset))
Anantha Krishnana3dcce42012-01-05 19:27:57 +0530352#define LSH_DATA(val, offset) ((val) << (offset))
Anantha Krishnan29f1d932011-12-29 21:17:29 +0530353#define GET_ABS_VAL(val) ((val) & (0xFF))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700354
355enum radio_state_t {
356 FM_OFF,
357 FM_RECV,
358 FM_TRANS,
359 FM_RESET,
360};
361
362#define XFRCTRL_WRITE (1 << 7)
363
364/* Interrupt status */
365
366/* interrupt register 1 */
367#define READY (1 << 0) /* Radio ready after powerup or reset */
368#define TUNE (1 << 1) /* Tune completed */
369#define SEARCH (1 << 2) /* Search completed (read FREQ) */
370#define SCANNEXT (1 << 3) /* Scanning for next station */
371#define SIGNAL (1 << 4) /* Signal indicator change (read SIGSTATE) */
372#define INTF (1 << 5) /* Interference cnt has fallen outside range */
373#define SYNC (1 << 6) /* RDS sync state change (read RDSSYNC) */
374#define AUDIO (1 << 7) /* Audio Control indicator (read AUDIOIND) */
375
376/* interrupt register 2 */
377#define RDSDAT (1 << 0) /* New unread RDS data group available */
378#define BLOCKB (1 << 1) /* Block-B match condition exists */
379#define PROGID (1 << 2) /* Block-A or Block-C matched stored PI value*/
380#define RDSPS (1 << 3) /* New RDS Program Service Table available */
381#define RDSRT (1 << 4) /* New RDS Radio Text available */
382#define RDSAF (1 << 5) /* New RDS AF List available */
383#define TXRDSDAT (1 << 6) /* Transmitted an RDS group */
384#define TXRDSDONE (1 << 7) /* RDS raw group one-shot transmit completed */
385
386/* interrupt register 3 */
387#define TRANSFER (1 << 0) /* Data transfer (XFR) completed */
388#define RDSPROC (1 << 1) /* Dynamic RDS Processing complete */
389#define ERROR (1 << 7) /* Err occurred.Read code to determine cause */
390
391
392#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
393#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
394/* Transfer */
395enum tavarua_xfr_ctrl_t {
396 RDS_PS_0 = 0x01,
397 RDS_PS_1,
398 RDS_PS_2,
399 RDS_PS_3,
400 RDS_PS_4,
401 RDS_PS_5,
402 RDS_PS_6,
403 RDS_RT_0,
404 RDS_RT_1,
405 RDS_RT_2,
406 RDS_RT_3,
407 RDS_RT_4,
408 RDS_AF_0,
409 RDS_AF_1,
410 RDS_CONFIG,
411 RDS_TX_GROUPS,
412 RDS_COUNT_0,
413 RDS_COUNT_1,
414 RDS_COUNT_2,
415 RADIO_CONFIG,
416 RX_CONFIG,
417 RX_TIMERS,
418 RX_STATIONS_0,
419 RX_STATIONS_1,
420 INT_CTRL,
421 ERROR_CODE,
422 CHIPID,
423 CAL_DAT_0 = 0x20,
424 CAL_DAT_1,
425 CAL_DAT_2,
426 CAL_DAT_3,
427 CAL_CFG_0,
428 CAL_CFG_1,
429 DIG_INTF_0,
430 DIG_INTF_1,
431 DIG_AGC_0,
432 DIG_AGC_1,
433 DIG_AGC_2,
434 DIG_AUDIO_0,
435 DIG_AUDIO_1,
436 DIG_AUDIO_2,
437 DIG_AUDIO_3,
438 DIG_AUDIO_4,
439 DIG_RXRDS,
440 DIG_DCC,
441 DIG_SPUR,
442 DIG_MPXDCC,
443 DIG_PILOT,
444 DIG_DEMOD,
445 DIG_MOST,
446 DIG_TX_0,
447 DIG_TX_1,
448 PHY_TXGAIN = 0x3B,
449 PHY_CONFIG,
450 PHY_TXBLOCK,
451 PHY_TCB,
452 XFR_PEEK_MODE = 0x40,
453 XFR_POKE_MODE = 0xC0,
454 TAVARUA_XFR_CTRL_MAX
455};
456
457enum tavarua_evt_t {
458 TAVARUA_EVT_RADIO_READY,
459 TAVARUA_EVT_TUNE_SUCC,
460 TAVARUA_EVT_SEEK_COMPLETE,
461 TAVARUA_EVT_SCAN_NEXT,
462 TAVARUA_EVT_NEW_RAW_RDS,
463 TAVARUA_EVT_NEW_RT_RDS,
464 TAVARUA_EVT_NEW_PS_RDS,
465 TAVARUA_EVT_ERROR,
466 TAVARUA_EVT_BELOW_TH,
467 TAVARUA_EVT_ABOVE_TH,
468 TAVARUA_EVT_STEREO,
469 TAVARUA_EVT_MONO,
470 TAVARUA_EVT_RDS_AVAIL,
471 TAVARUA_EVT_RDS_NOT_AVAIL,
472 TAVARUA_EVT_NEW_SRCH_LIST,
473 TAVARUA_EVT_NEW_AF_LIST,
474 TAVARUA_EVT_TXRDSDAT,
Ayaz Ahmad0fa19842012-03-14 22:54:53 +0530475 TAVARUA_EVT_TXRDSDONE,
476 TAVARUA_EVT_RADIO_DISABLED
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700477};
478
479enum tavarua_region_t {
480 TAVARUA_REGION_US,
481 TAVARUA_REGION_EU,
482 TAVARUA_REGION_JAPAN,
483 TAVARUA_REGION_JAPAN_WIDE,
484 TAVARUA_REGION_OTHER
485};
486
487#endif /* __LINUX_TAVARUA_H */