blob: aafa5d062767c73d0d9f6b58d41fb27d123e4907 [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 Krishnana02ef212011-06-28 00:57:25 +053044#define ENF_200Khz (1)
45#define SRCH200KHZ_OFFSET (7)
46#define SRCH_MASK (1 << SRCH200KHZ_OFFSET)
47
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070048/* Standard buffer size */
49#define STD_BUF_SIZE (64)
50/* Search direction */
51#define SRCH_DIR_UP (0)
52#define SRCH_DIR_DOWN (1)
53
54/* control options */
55#define CTRL_ON (1)
56#define CTRL_OFF (0)
57
58#define US_LOW_BAND (87.5)
59#define US_HIGH_BAND (108)
60
61/* constant for Tx */
62
63#define MASK_PI (0x0000FFFF)
64#define MASK_PI_MSB (0x0000FF00)
65#define MASK_PI_LSB (0x000000FF)
66#define MASK_PTY (0x0000001F)
67#define MASK_TXREPCOUNT (0x0000000F)
68
69#undef FMDBG
70#ifdef FM_DEBUG
71 #define FMDBG(fmt, args...) printk(KERN_INFO "tavarua_radio: " fmt, ##args)
72#else
73 #define FMDBG(fmt, args...)
74#endif
75
76#undef FMDERR
77#define FMDERR(fmt, args...) printk(KERN_INFO "tavarua_radio: " fmt, ##args)
78
79#undef FMDBG_I2C
80#ifdef FM_DEBUG_I2C
81 #define FMDBG_I2C(fmt, args...) printk(KERN_INFO "fm_i2c: " fmt, ##args)
82#else
83 #define FMDBG_I2C(fmt, args...)
84#endif
85
86/* function declarations */
87/* FM Core audio paths. */
88#define TAVARUA_AUDIO_OUT_ANALOG_OFF (0)
89#define TAVARUA_AUDIO_OUT_ANALOG_ON (1)
90#define TAVARUA_AUDIO_OUT_DIGITAL_OFF (0)
91#define TAVARUA_AUDIO_OUT_DIGITAL_ON (1)
92
93int tavarua_set_audio_path(int digital_on, int analog_on);
94
95/* defines and enums*/
96
97#define MARIMBA_A0 0x01010013
98#define MARIMBA_2_1 0x02010204
99#define BAHAMA_1_0 0x0302010A
100#define BAHAMA_2_0 0x04020205
101#define WAIT_TIMEOUT 2000
102#define RADIO_INIT_TIME 15
103#define TAVARUA_DELAY 10
104/*
105 * The frequency is set in units of 62.5 Hz when using V4L2_TUNER_CAP_LOW,
106 * 62.5 kHz otherwise.
107 * The tuner is able to have a channel spacing of 50, 100 or 200 kHz.
108 * tuner->capability is therefore set to V4L2_TUNER_CAP_LOW
109 * The FREQ_MUL is then: 1 MHz / 62.5 Hz = 16000
110 */
111#define FREQ_MUL (1000000 / 62.5)
112
113enum v4l2_cid_private_tavarua_t {
114 V4L2_CID_PRIVATE_TAVARUA_SRCHMODE = (V4L2_CID_PRIVATE_BASE + 1),
115 V4L2_CID_PRIVATE_TAVARUA_SCANDWELL,
116 V4L2_CID_PRIVATE_TAVARUA_SRCHON,
117 V4L2_CID_PRIVATE_TAVARUA_STATE,
118 V4L2_CID_PRIVATE_TAVARUA_TRANSMIT_MODE,
119 V4L2_CID_PRIVATE_TAVARUA_RDSGROUP_MASK,
120 V4L2_CID_PRIVATE_TAVARUA_REGION,
121 V4L2_CID_PRIVATE_TAVARUA_SIGNAL_TH,
122 V4L2_CID_PRIVATE_TAVARUA_SRCH_PTY,
123 V4L2_CID_PRIVATE_TAVARUA_SRCH_PI,
124 V4L2_CID_PRIVATE_TAVARUA_SRCH_CNT,
125 V4L2_CID_PRIVATE_TAVARUA_EMPHASIS,
126 V4L2_CID_PRIVATE_TAVARUA_RDS_STD,
127 V4L2_CID_PRIVATE_TAVARUA_SPACING,
128 V4L2_CID_PRIVATE_TAVARUA_RDSON,
129 V4L2_CID_PRIVATE_TAVARUA_RDSGROUP_PROC,
130 V4L2_CID_PRIVATE_TAVARUA_LP_MODE,
131 V4L2_CID_PRIVATE_TAVARUA_ANTENNA,
132 V4L2_CID_PRIVATE_TAVARUA_RDSD_BUF,
133 V4L2_CID_PRIVATE_TAVARUA_PSALL,
134 /*v4l2 Tx controls*/
135 V4L2_CID_PRIVATE_TAVARUA_TX_SETPSREPEATCOUNT,
136 V4L2_CID_PRIVATE_TAVARUA_STOP_RDS_TX_PS_NAME,
137 V4L2_CID_PRIVATE_TAVARUA_STOP_RDS_TX_RT,
138 V4L2_CID_PRIVATE_TAVARUA_IOVERC,
139 V4L2_CID_PRIVATE_TAVARUA_INTDET,
140 V4L2_CID_PRIVATE_TAVARUA_MPX_DCC,
Anantha Krishnane46ef6f2011-06-29 23:56:03 +0530141 V4L2_CID_PRIVATE_TAVARUA_AF_JUMP,
Anantha Krishnanf2258602011-06-30 01:32:09 +0530142 V4L2_CID_PRIVATE_TAVARUA_RSSI_DELTA,
Srinivasa Rao Uppala4e38bfc2011-09-15 16:00:31 +0530143 V4L2_CID_PRIVATE_TAVARUA_HLSI,
144 /*
145 * Here We have IOCTl's that are specifici to IRIS
146 * (V4L2_CID_PRIVATE_BASE+0x1D--V4L2_CID_PRIVATE_BASE+0x27)
147 */
Anantha Krishnanc72725a2011-09-06 09:28:22 +0530148 V4L2_CID_PRIVATE_TAVARUA_SET_NOTCH_FILTER =
149 V4L2_CID_PRIVATE_BASE + 0x28,
150 V4L2_CID_PRIVATE_TAVARUA_SET_AUDIO_PATH
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700151};
152
153enum tavarua_buf_t {
154 TAVARUA_BUF_SRCH_LIST,
155 TAVARUA_BUF_EVENTS,
156 TAVARUA_BUF_RT_RDS,
157 TAVARUA_BUF_PS_RDS,
158 TAVARUA_BUF_RAW_RDS,
159 TAVARUA_BUF_AF_LIST,
160 TAVARUA_BUF_MAX
161};
162
163enum tavarua_xfr_t {
164 TAVARUA_XFR_SYNC,
165 TAVARUA_XFR_ERROR,
166 TAVARUA_XFR_SRCH_LIST,
167 TAVARUA_XFR_RT_RDS,
168 TAVARUA_XFR_PS_RDS,
169 TAVARUA_XFR_AF_LIST,
170 TAVARUA_XFR_MAX
171};
172
Anantha Krishnana02ef212011-06-28 00:57:25 +0530173enum channel_spacing {
174 FM_CH_SPACE_200KHZ,
175 FM_CH_SPACE_100KHZ,
176 FM_CH_SPACE_50KHZ
177};
178
179enum step_size {
180 NO_SRCH200khz,
181 ENF_SRCH200khz
182};
183
184enum emphasis {
185 EMP_75,
186 EMP_50
187};
188
189enum rds_std {
190 RBDS_STD,
191 RDS_STD
192};
193
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700194/* offsets */
195#define RAW_RDS 0x0F
196#define RDS_BLOCK 3
197
198/* registers*/
199#define MARIMBA_XO_BUFF_CNTRL 0x07
200#define RADIO_REGISTERS 0x30
201#define XFR_REG_NUM 16
202#define STATUS_REG_NUM 3
203
204/* TX constants */
205#define HEADER_SIZE 4
206#define TX_ON 0x80
207#define TAVARUA_TX_RT RDS_RT_0
208#define TAVARUA_TX_PS RDS_PS_0
209
210enum register_t {
211 STATUS_REG1 = 0,
212 STATUS_REG2,
213 STATUS_REG3,
214 RDCTRL,
215 FREQ,
216 TUNECTRL,
217 SRCHRDS1,
218 SRCHRDS2,
219 SRCHCTRL,
220 IOCTRL,
221 RDSCTRL,
222 ADVCTRL,
223 AUDIOCTRL,
224 RMSSI,
225 IOVERC,
226 AUDIOIND = 0x1E,
227 XFRCTRL,
228 FM_CTL0 = 0xFF,
229 LEAKAGE_CNTRL = 0xFE,
230};
231#define BAHAMA_RBIAS_CTL1 0x07
232#define BAHAMA_FM_MODE_REG 0xFD
233#define BAHAMA_FM_CTL1_REG 0xFE
234#define BAHAMA_FM_CTL0_REG 0xFF
235#define BAHAMA_FM_MODE_NORMAL 0x00
236#define BAHAMA_LDO_DREG_CTL0 0xF0
237#define BAHAMA_LDO_AREG_CTL0 0xF4
238
239/* Radio Control */
240#define RDCTRL_STATE_OFFSET 0
241#define RDCTRL_STATE_MASK (3 << RDCTRL_STATE_OFFSET)
242#define RDCTRL_BAND_OFFSET 2
243#define RDCTRL_BAND_MASK (1 << RDCTRL_BAND_OFFSET)
244#define RDCTRL_CHSPACE_OFFSET 3
245#define RDCTRL_CHSPACE_MASK (3 << RDCTRL_CHSPACE_OFFSET)
246#define RDCTRL_DEEMPHASIS_OFFSET 5
247#define RDCTRL_DEEMPHASIS_MASK (1 << RDCTRL_DEEMPHASIS_OFFSET)
248#define RDCTRL_HLSI_OFFSET 6
249#define RDCTRL_HLSI_MASK (3 << RDCTRL_HLSI_OFFSET)
Anantha Krishnane46ef6f2011-06-29 23:56:03 +0530250#define RDSAF_OFFSET 6
251#define RDSAF_MASK (1 << RDSAF_OFFSET)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700252
253/* Tune Control */
254#define TUNE_STATION 0x01
255#define ADD_OFFSET (1 << 1)
256#define SIGSTATE (1 << 5)
257#define MOSTSTATE (1 << 6)
258#define RDSSYNC (1 << 7)
259/* Search Control */
260#define SRCH_MODE_OFFSET 0
261#define SRCH_MODE_MASK (7 << SRCH_MODE_OFFSET)
262#define SRCH_DIR_OFFSET 3
263#define SRCH_DIR_MASK (1 << SRCH_DIR_OFFSET)
264#define SRCH_DWELL_OFFSET 4
265#define SRCH_DWELL_MASK (7 << SRCH_DWELL_OFFSET)
266#define SRCH_STATE_OFFSET 7
267#define SRCH_STATE_MASK (1 << SRCH_STATE_OFFSET)
268
269/* I/O Control */
270#define IOC_HRD_MUTE 0x03
271#define IOC_SFT_MUTE (1 << 2)
272#define IOC_MON_STR (1 << 3)
273#define IOC_SIG_BLND (1 << 4)
274#define IOC_INTF_BLND (1 << 5)
275#define IOC_ANTENNA (1 << 6)
276#define IOC_ANTENNA_OFFSET 6
277#define IOC_ANTENNA_MASK (1 << IOC_ANTENNA_OFFSET)
278
279/* RDS Control */
280#define RDS_ON 0x01
281#define RDSCTRL_STANDARD_OFFSET 1
282#define RDSCTRL_STANDARD_MASK (1 << RDSCTRL_STANDARD_OFFSET)
283
284/* Advanced features controls */
285#define RDSRTEN (1 << 3)
286#define RDSPSEN (1 << 4)
287
288/* Audio path control */
289#define AUDIORX_ANALOG_OFFSET 0
290#define AUDIORX_ANALOG_MASK (1 << AUDIORX_ANALOG_OFFSET)
291#define AUDIORX_DIGITAL_OFFSET 1
292#define AUDIORX_DIGITAL_MASK (1 << AUDIORX_DIGITAL_OFFSET)
293#define AUDIOTX_OFFSET 2
294#define AUDIOTX_MASK (1 << AUDIOTX_OFFSET)
295#define I2SCTRL_OFFSET 3
296#define I2SCTRL_MASK (1 << I2SCTRL_OFFSET)
297
298/* Search options */
299enum search_t {
300 SEEK,
301 SCAN,
302 SCAN_FOR_STRONG,
303 SCAN_FOR_WEAK,
304 RDS_SEEK_PTY,
305 RDS_SCAN_PTY,
306 RDS_SEEK_PI,
307 RDS_AF_JUMP,
308};
309
Anantha Krishnanc72725a2011-09-06 09:28:22 +0530310enum audio_path {
311 FM_DIGITAL_PATH,
312 FM_ANALOG_PATH
313};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700314#define SRCH_MODE 0x07
315#define SRCH_DIR 0x08 /* 0-up 1-down */
316#define SCAN_DWELL 0x70
317#define SRCH_ON 0x80
318
319/* RDS CONFIG */
320#define RDS_CONFIG_PSALL 0x01
321
322#define FM_ENABLE 0x22
323#define SET_REG_FIELD(reg, val, offset, mask) \
324 (reg = (reg & ~mask) | (((val) << offset) & mask))
325#define GET_REG_FIELD(reg, offset, mask) ((reg & mask) >> offset)
326
327enum radio_state_t {
328 FM_OFF,
329 FM_RECV,
330 FM_TRANS,
331 FM_RESET,
332};
333
334#define XFRCTRL_WRITE (1 << 7)
335
336/* Interrupt status */
337
338/* interrupt register 1 */
339#define READY (1 << 0) /* Radio ready after powerup or reset */
340#define TUNE (1 << 1) /* Tune completed */
341#define SEARCH (1 << 2) /* Search completed (read FREQ) */
342#define SCANNEXT (1 << 3) /* Scanning for next station */
343#define SIGNAL (1 << 4) /* Signal indicator change (read SIGSTATE) */
344#define INTF (1 << 5) /* Interference cnt has fallen outside range */
345#define SYNC (1 << 6) /* RDS sync state change (read RDSSYNC) */
346#define AUDIO (1 << 7) /* Audio Control indicator (read AUDIOIND) */
347
348/* interrupt register 2 */
349#define RDSDAT (1 << 0) /* New unread RDS data group available */
350#define BLOCKB (1 << 1) /* Block-B match condition exists */
351#define PROGID (1 << 2) /* Block-A or Block-C matched stored PI value*/
352#define RDSPS (1 << 3) /* New RDS Program Service Table available */
353#define RDSRT (1 << 4) /* New RDS Radio Text available */
354#define RDSAF (1 << 5) /* New RDS AF List available */
355#define TXRDSDAT (1 << 6) /* Transmitted an RDS group */
356#define TXRDSDONE (1 << 7) /* RDS raw group one-shot transmit completed */
357
358/* interrupt register 3 */
359#define TRANSFER (1 << 0) /* Data transfer (XFR) completed */
360#define RDSPROC (1 << 1) /* Dynamic RDS Processing complete */
361#define ERROR (1 << 7) /* Err occurred.Read code to determine cause */
362
363
364#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
365#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
366/* Transfer */
367enum tavarua_xfr_ctrl_t {
368 RDS_PS_0 = 0x01,
369 RDS_PS_1,
370 RDS_PS_2,
371 RDS_PS_3,
372 RDS_PS_4,
373 RDS_PS_5,
374 RDS_PS_6,
375 RDS_RT_0,
376 RDS_RT_1,
377 RDS_RT_2,
378 RDS_RT_3,
379 RDS_RT_4,
380 RDS_AF_0,
381 RDS_AF_1,
382 RDS_CONFIG,
383 RDS_TX_GROUPS,
384 RDS_COUNT_0,
385 RDS_COUNT_1,
386 RDS_COUNT_2,
387 RADIO_CONFIG,
388 RX_CONFIG,
389 RX_TIMERS,
390 RX_STATIONS_0,
391 RX_STATIONS_1,
392 INT_CTRL,
393 ERROR_CODE,
394 CHIPID,
395 CAL_DAT_0 = 0x20,
396 CAL_DAT_1,
397 CAL_DAT_2,
398 CAL_DAT_3,
399 CAL_CFG_0,
400 CAL_CFG_1,
401 DIG_INTF_0,
402 DIG_INTF_1,
403 DIG_AGC_0,
404 DIG_AGC_1,
405 DIG_AGC_2,
406 DIG_AUDIO_0,
407 DIG_AUDIO_1,
408 DIG_AUDIO_2,
409 DIG_AUDIO_3,
410 DIG_AUDIO_4,
411 DIG_RXRDS,
412 DIG_DCC,
413 DIG_SPUR,
414 DIG_MPXDCC,
415 DIG_PILOT,
416 DIG_DEMOD,
417 DIG_MOST,
418 DIG_TX_0,
419 DIG_TX_1,
420 PHY_TXGAIN = 0x3B,
421 PHY_CONFIG,
422 PHY_TXBLOCK,
423 PHY_TCB,
424 XFR_PEEK_MODE = 0x40,
425 XFR_POKE_MODE = 0xC0,
426 TAVARUA_XFR_CTRL_MAX
427};
428
429enum tavarua_evt_t {
430 TAVARUA_EVT_RADIO_READY,
431 TAVARUA_EVT_TUNE_SUCC,
432 TAVARUA_EVT_SEEK_COMPLETE,
433 TAVARUA_EVT_SCAN_NEXT,
434 TAVARUA_EVT_NEW_RAW_RDS,
435 TAVARUA_EVT_NEW_RT_RDS,
436 TAVARUA_EVT_NEW_PS_RDS,
437 TAVARUA_EVT_ERROR,
438 TAVARUA_EVT_BELOW_TH,
439 TAVARUA_EVT_ABOVE_TH,
440 TAVARUA_EVT_STEREO,
441 TAVARUA_EVT_MONO,
442 TAVARUA_EVT_RDS_AVAIL,
443 TAVARUA_EVT_RDS_NOT_AVAIL,
444 TAVARUA_EVT_NEW_SRCH_LIST,
445 TAVARUA_EVT_NEW_AF_LIST,
446 TAVARUA_EVT_TXRDSDAT,
447 TAVARUA_EVT_TXRDSDONE
448};
449
450enum tavarua_region_t {
451 TAVARUA_REGION_US,
452 TAVARUA_REGION_EU,
453 TAVARUA_REGION_JAPAN,
454 TAVARUA_REGION_JAPAN_WIDE,
455 TAVARUA_REGION_OTHER
456};
457
458#endif /* __LINUX_TAVARUA_H */