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