blob: 05fc309e16fc67223cab7818283eba5aac30f429 [file] [log] [blame]
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001/*
2Copyright (c) 2015, The Linux Foundation. All rights reserved.
3
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are
6met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above
10 copyright notice, this list of conditions and the following
11 disclaimer in the documentation and/or other materials provided
12 with the distribution.
13 * Neither the name of The Linux Foundation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#ifndef __UAPI_RADIO_HCI_CORE_H
31#define __UAPI_RADIO_HCI_CORE_H
32
33#pragma pack(1)
34
35#include <stdbool.h>
36
37pthread_mutex_t fm_hal;
38#define MIN_TX_TONE_VAL 0x00
39#define MAX_TX_TONE_VAL 0x07
40#define MIN_HARD_MUTE_VAL 0x00
41#define MAX_HARD_MUTE_VAL 0x03
42#define MIN_SRCH_MODE 0x00
43#define MAX_SRCH_MODE 0x09
44#define MIN_SCAN_DWELL 0x00
45#define MAX_SCAN_DWELL 0x0F
46#define MIN_SIG_TH 0x00
47#define MAX_SIG_TH 0x03
48#define MIN_PTY 0X00
49#define MAX_PTY 0x1F
50#define MIN_PI 0x0000
51#define MAX_PI 0xFFFF
52#define MIN_SRCH_STATIONS_CNT 0x00
53#define MAX_SRCH_STATIONS_CNT 0x14
54#define MIN_CHAN_SPACING 0x00
55#define MAX_CHAN_SPACING 0x02
56#define MIN_EMPHASIS 0x00
57#define MAX_EMPHASIS 0x01
58#define MIN_RDS_STD 0x00
59#define MAX_RDS_STD 0x02
60#define MIN_ANTENNA_VAL 0x00
61#define MAX_ANTENNA_VAL 0x01
62#define MIN_TX_PS_REPEAT_CNT 0x01
63#define MAX_TX_PS_REPEAT_CNT 0x0F
64#define MIN_SOFT_MUTE 0x00
65#define MAX_SOFT_MUTE 0x01
66#define MIN_PEEK_ACCESS_LEN 0x01
67#define MAX_PEEK_ACCESS_LEN 0xF9
68#define MIN_RESET_CNTR 0x00
69#define MAX_RESET_CNTR 0x01
70#define MIN_HLSI 0x00
71#define MAX_HLSI 0x02
72#define MIN_NOTCH_FILTER 0x00
73#define MAX_NOTCH_FILTER 0x02
74#define MIN_INTF_DET_OUT_LW_TH 0x00
75#define MAX_INTF_DET_OUT_LW_TH 0xFF
76#define MIN_INTF_DET_OUT_HG_TH 0x00
77#define MAX_INTF_DET_OUT_HG_TH 0xFF
78#define MIN_SINR_TH -128
79#define MAX_SINR_TH 127
80#define MIN_SINR_SAMPLES 0x01
81#define MAX_SINR_SAMPLES 0xFF
82#define MIN_BLEND_HI -128
83#define MAX_BLEND_HI 127
84
85
86/* ---- HCI Packet structures ---- */
87#define RADIO_HCI_COMMAND_HDR_SIZE sizeof(struct radio_hci_command_hdr)
88#define RADIO_HCI_EVENT_HDR_SIZE sizeof(struct radio_hci_event_hdr)
89
90/* HCI data types */
91#define RADIO_HCI_COMMAND_PKT 0x11
92#define RADIO_HCI_EVENT_PKT 0x14
93/*HCI reponce packets*/
94#define MAX_RIVA_PEEK_RSP_SIZE 251
95/* default data access */
96#define DEFAULT_DATA_OFFSET 2
97#define DEFAULT_DATA_SIZE 249
98/* Power levels are 0-7, but SOC will expect values from 0-255
99 * So the each level step size will be 255/7 = 36 */
100#define FM_TX_PWR_LVL_STEP_SIZE 36
101#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
102#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
103#define FM_TX_PHY_CFG_MODE 0x3c
104#define FM_TX_PHY_CFG_LEN 0x10
105#define FM_TX_PWR_GAIN_OFFSET 14
106/**RDS CONFIG MODE**/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530107#define FM_RDS_CNFG_MODE 0x0f
108#define FM_RDS_CNFG_LEN 0x10
109#define AF_RMSSI_TH_OFFSET 1
110#define AF_RMSSI_SAMPLES_OFFSET 2
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700111/**RX CONFIG MODE**/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530112#define FM_RX_CONFG_MODE 0x15
113#define FM_RX_CNFG_LEN 0x15
114#define GD_CH_RMSSI_TH_OFFSET 0x03
115#define MAX_GD_CH_RMSSI_TH 0x7F
116#define SRCH_ALGO_TYPE_OFFSET 0x00
117#define SINRFIRSTSTAGE_OFFSET 0x01
118#define RMSSIFIRSTSTAGE_OFFSET 0x02
119#define CF0TH12_BYTE1_OFFSET 0x03
120#define CF0TH12_BYTE2_OFFSET 0x04
121#define MAX_SINR_FIRSTSTAGE 0x7F
122#define MAX_RMSSI_FIRSTSTAGE 0x7F
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700123#define RDS_PS0_XFR_MODE 0x01
Kamal Negi8813e0f2016-02-10 19:12:09 +0530124#define RDS_PS0_LEN 0x06
125#define RX_REPEATE_BYTE_OFFSET 0x05
126#define FM_SPUR_TBL_SIZE 0xF0
127#define SPUR_DATA_LEN 0x10
128#define ENTRIES_EACH_CMD 0x0F
129#define SPUR_DATA_INDEX 0x02
130#define FM_AF_LIST_MAX_SIZE 0xC8
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700131#define AF_LIST_MAX (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist
Kamal Negi8813e0f2016-02-10 19:12:09 +0530132 of sizeof(int) bytes */
133#define MAX_BLEND_INDEX 0x31
134
135#define FM_SRCH_CONFG_MODE 0x41
136#define FM_AFJUMP_CONFG_MODE 0x42
137#define FM_SRCH_CNFG_LEN 0x08
138#define FM_AFJUMP_CNFG_LEN 0x06
139
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700140/* HCI timeouts */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530141#define RADIO_HCI_TIMEOUT (10000) /* 10 seconds */
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700142
143typedef enum {
144 ASSOCIATE_JVM,
145 DISASSOCIATE_JVM
146} bt_cb_thread_evt;
147
148#define TUNE_PARAM 16
149#define SIZE_ARRAY(x) (sizeof(x) / sizeof((x)[0]))
150typedef void (*enb_result_cb)();
151typedef void (*tune_rsp_cb)(int Freq);
152typedef void (*seek_rsp_cb)(int Freq);
153typedef void (*scan_rsp_cb)();
154typedef void (*srch_list_rsp_cb)(uint16_t *scan_tbl);
155typedef void (*stereo_mode_cb)(bool status);
156typedef void (*rds_avl_sts_cb)(bool status);
157typedef void (*af_list_cb)(uint16_t *af_list);
158typedef void (*rt_cb)(char *rt);
159typedef void (*ps_cb)(char *ps);
160typedef void (*oda_cb)();
161typedef void (*rt_plus_cb)(char *rt_plus);
162typedef void (*ert_cb)(char *ert);
163typedef void (*disable_cb)();
164typedef void (*callback_thread_event)(unsigned int evt);
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700165typedef void (*rds_grp_cntrs_cb)(char *rds_params);
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800166typedef void (*fm_peek_cb)(char *peek_rsp);
167typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
168typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800169typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
Kamal Negi8813e0f2016-02-10 19:12:09 +0530170typedef void (*fm_sig_thr_cb) (int val, int status);
171typedef void (*fm_get_ch_det_thrs_cb) (int val, int status);
172typedef void (*fm_def_data_rd_cb) (int val, int status);
173typedef void (*fm_get_blnd_cb) (int val, int status);
174typedef void (*fm_set_ch_det_thrs_cb) (int status);
175typedef void (*fm_def_data_wrt_cb) (int status);
176typedef void (*fm_set_blnd_cb) (int status);
177typedef void (*fm_get_stn_prm_cb) (int val, int status);
178typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700179
180typedef struct {
181 size_t size;
182
183 enb_result_cb enabled_cb;
184 tune_rsp_cb tune_cb;
185 seek_rsp_cb seek_cmpl_cb;
186 scan_rsp_cb scan_next_cb;
187 srch_list_rsp_cb srch_list_cb;
188 stereo_mode_cb stereo_status_cb;
189 rds_avl_sts_cb rds_avail_status_cb;
190 af_list_cb af_list_update_cb;
191 rt_cb rt_update_cb;
192 ps_cb ps_update_cb;
193 oda_cb oda_update_cb;
194 rt_plus_cb rt_plus_update_cb;
195 ert_cb ert_update_cb;
196 disable_cb disabled_cb;
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700197 rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb;
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800198 fm_peek_cb fm_peek_rsp_cb;
199 fm_ssbi_peek_cb fm_ssbi_peek_rsp_cb;
200 fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800201 fm_ecc_evt_cb ext_country_code_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700202 callback_thread_event thread_evt_cb;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530203 fm_sig_thr_cb fm_get_sig_thres_cb;
204 fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb;
205 fm_def_data_rd_cb fm_def_data_read_cb;
206 fm_get_blnd_cb fm_get_blend_cb;
207 fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb;
208 fm_def_data_wrt_cb fm_def_data_write_cb;
209 fm_set_blnd_cb fm_set_blend_cb;
210 fm_get_stn_prm_cb fm_get_station_param_cb;
211 fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700212} fm_vendor_callbacks_t;
213
214pthread_mutex_t radio_fm_cmd;
215typedef struct {
216 int (*init)(const fm_vendor_callbacks_t *p_cb);
217 int (*set_fm_ctrl)(int opcode, int val);
218 void (*Get_fm_ctrl) (int opcode, int val);
219} fm_interface_t;
220
221typedef int (*fm_evt_notify_cb)(unsigned char *p_buf);
222
223typedef struct {
224 fm_evt_notify_cb fm_evt_notify;
225} fm_hal_cb;
226
227struct radio_hci_command_hdr {
228 short opcode; /* OCF & OGF */
229 char plen;
230} ;
231
232struct radio_hci_event_hdr {
233 char evt;
234 char plen;
235} ;
236
237struct radio_hci_dev {
238 char name[8];
239 unsigned long flags;
240 short id;
241 char bus;
242 char dev_type;
243 char dev_name[248];
244 char dev_class[3];
245 char features[8];
246 char commands[64];
247 unsigned int data_block_len;
248 unsigned long cmd_last_tx;
249 int req_status;
250 int req_result;
251};
252
253/* Opcode OCF */
254/* HCI recv control commands opcode */
255#define HCI_OCF_FM_ENABLE_RECV_REQ 0x0001
256#define HCI_OCF_FM_DISABLE_RECV_REQ 0x0002
257#define HCI_OCF_FM_GET_RECV_CONF_REQ 0x0003
258#define HCI_OCF_FM_SET_RECV_CONF_REQ 0x0004
259#define HCI_OCF_FM_SET_MUTE_MODE_REQ 0x0005
260#define HCI_OCF_FM_SET_STEREO_MODE_REQ 0x0006
261#define HCI_OCF_FM_SET_ANTENNA 0x0007
262#define HCI_OCF_FM_SET_SIGNAL_THRESHOLD 0x0008
263#define HCI_OCF_FM_GET_SIGNAL_THRESHOLD 0x0009
264#define HCI_OCF_FM_GET_STATION_PARAM_REQ 0x000A
265#define HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ 0x000B
266#define HCI_OCF_FM_GET_RADIO_TEXT_REQ 0x000C
267#define HCI_OCF_FM_GET_AF_LIST_REQ 0x000D
268#define HCI_OCF_FM_SEARCH_STATIONS 0x000E
269#define HCI_OCF_FM_SEARCH_RDS_STATIONS 0x000F
270#define HCI_OCF_FM_SEARCH_STATIONS_LIST 0x0010
271#define HCI_OCF_FM_CANCEL_SEARCH 0x0011
272#define HCI_OCF_FM_RDS_GRP 0x0012
273#define HCI_OCF_FM_RDS_GRP_PROCESS 0x0013
274#define HCI_OCF_FM_EN_WAN_AVD_CTRL 0x0014
275#define HCI_OCF_FM_EN_NOTCH_CTRL 0x0015
276#define HCI_OCF_FM_SET_EVENT_MASK 0x0016
277#define HCI_OCF_FM_SET_CH_DET_THRESHOLD 0x0017
278#define HCI_OCF_FM_GET_CH_DET_THRESHOLD 0x0018
279#define HCI_OCF_FM_SET_BLND_TBL 0x001B
280#define HCI_OCF_FM_GET_BLND_TBL 0x001C
281/* HCI trans control commans opcode*/
282#define HCI_OCF_FM_ENABLE_TRANS_REQ 0x0001
283#define HCI_OCF_FM_DISABLE_TRANS_REQ 0x0002
284#define HCI_OCF_FM_GET_TRANS_CONF_REQ 0x0003
285#define HCI_OCF_FM_SET_TRANS_CONF_REQ 0x0004
286#define HCI_OCF_FM_RDS_RT_REQ 0x0008
287#define HCI_OCF_FM_RDS_PS_REQ 0x0009
288
289
290/* HCI common control commands opcode */
291#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
292#define HCI_OCF_FM_DEFAULT_DATA_READ 0x0002
293#define HCI_OCF_FM_DEFAULT_DATA_WRITE 0x0003
294#define HCI_OCF_FM_RESET 0x0004
295#define HCI_OCF_FM_GET_FEATURE_LIST 0x0005
296#define HCI_OCF_FM_DO_CALIBRATION 0x0006
297#define HCI_OCF_FM_SET_CALIBRATION 0x0007
298#define HCI_OCF_FM_SET_SPUR_TABLE 0x0008
299#define HCI_OCF_FM_GET_SPUR_TABLE 0x0009
300
301/*HCI Status parameters commands*/
302#define HCI_OCF_FM_READ_GRP_COUNTERS 0x0001
303
304/*HCI Diagnostic commands*/
305#define HCI_OCF_FM_PEEK_DATA 0x0002
306#define HCI_OCF_FM_POKE_DATA 0x0003
307#define HCI_OCF_FM_SSBI_PEEK_REG 0x0004
308#define HCI_OCF_FM_SSBI_POKE_REG 0x0005
309#define HCI_OCF_FM_STATION_DBG_PARAM 0x0007
310#define HCI_FM_SET_INTERNAL_TONE_GENRATOR 0x0008
311
312/* Opcode OGF */
313#define HCI_OGF_FM_RECV_CTRL_CMD_REQ 0x0013
314#define HCI_OGF_FM_TRANS_CTRL_CMD_REQ 0x0014
315#define HCI_OGF_FM_COMMON_CTRL_CMD_REQ 0x0015
316#define HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ 0x0016
317#define HCI_OGF_FM_TEST_CMD_REQ 0x0017
318#define HCI_OGF_FM_DIAGNOSTIC_CMD_REQ 0x003F
319
320/* Command opcode pack/unpack */
321#define hci_opcode_pack(ogf, ocf) (short) ((ocf & 0x03ff)|(ogf << 10))
322#define hci_opcode_ogf(op) (op >> 10)
323#define hci_opcode_ocf(op) (op & 0x03ff)
324#define hci_recv_ctrl_cmd_op_pack(ocf) \
325 (short) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
326#define hci_trans_ctrl_cmd_op_pack(ocf) \
327 (short) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530328#define hci_common_cmd_op_pack(ocf) \
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700329 (short) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530330#define hci_status_param_op_pack(ocf) \
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700331 (short) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530332#define hci_diagnostic_cmd_op_pack(ocf) \
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700333 (short) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
334
335
336/* HCI commands with no arguments*/
337#define HCI_FM_ENABLE_RECV_CMD 1
338#define HCI_FM_DISABLE_RECV_CMD 2
339#define HCI_FM_GET_RECV_CONF_CMD 3
340#define HCI_FM_GET_STATION_PARAM_CMD 4
341#define HCI_FM_GET_SIGNAL_TH_CMD 5
342#define HCI_FM_GET_PROGRAM_SERVICE_CMD 6
343#define HCI_FM_GET_RADIO_TEXT_CMD 7
344#define HCI_FM_GET_AF_LIST_CMD 8
345#define HCI_FM_CANCEL_SEARCH_CMD 9
346#define HCI_FM_RESET_CMD 10
347#define HCI_FM_GET_FEATURES_CMD 11
348#define HCI_FM_STATION_DBG_PARAM_CMD 12
349#define HCI_FM_ENABLE_TRANS_CMD 13
350#define HCI_FM_DISABLE_TRANS_CMD 14
351#define HCI_FM_GET_TX_CONFIG 15
352#define HCI_FM_GET_DET_CH_TH_CMD 16
353#define HCI_FM_GET_BLND_TBL_CMD 17
354
355/* Defines for FM TX*/
356#define TX_PS_DATA_LENGTH 108
357#define TX_RT_DATA_LENGTH 64
358#define PS_STRING_LEN 9
359
360/* ----- HCI Command request ----- */
361struct hci_fm_recv_conf_req {
362 char emphasis;
363 char ch_spacing;
364 char rds_std;
365 char hlsi;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530366 int band_low_limit;
367 int band_high_limit;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700368} ;
369
370/* ----- HCI Command request ----- */
371struct hci_fm_trans_conf_req_struct {
372 char emphasis;
373 char rds_std;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530374 int band_low_limit;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700375 int band_high_limit;
376} ;
377
378
379/* ----- HCI Command request ----- */
380struct hci_fm_tx_ps {
381 char ps_control;
382 short pi;
383 char pty;
384 char ps_repeatcount;
385 char ps_num;
386 char ps_data[TX_PS_DATA_LENGTH];
387} ;
388
389struct hci_fm_tx_rt {
390 char rt_control;
391 short pi;
392 char pty;
393 char rt_len;
394 char rt_data[TX_RT_DATA_LENGTH];
395} ;
396
397struct hci_fm_mute_mode_req {
398 char hard_mute;
399 char soft_mute;
400} ;
401
402struct hci_fm_stereo_mode_req {
403 char stereo_mode;
404 char sig_blend;
405 char intf_blend;
406 char most_switch;
407} ;
408
409struct hci_fm_search_station_req {
410 char srch_mode;
411 char scan_time;
412 char srch_dir;
413} ;
414
415struct hci_fm_search_rds_station_req {
416 struct hci_fm_search_station_req srch_station;
417 char srch_pty;
418 short srch_pi;
419} ;
420
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700421struct hci_fm_rds_grp_cntrs_params {
422 int totalRdsSBlockErrors;
423 int totalRdsGroups;
424 int totalRdsGroup0;
425 int totalRdsGroup2;
426 int totalRdsBlockB;
427 int totalRdsProcessedGroup0;
428 int totalRdsProcessedGroup2;
429 int totalRdsGroupFiltered;
430 int totalRdsChangeFiltered;
431} ;
432
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700433struct hci_fm_search_station_list_req {
434 char srch_list_mode;
435 char srch_list_dir;
436 int srch_list_max;
437 char srch_pty;
438} ;
439
440struct hci_fm_rds_grp_req {
441 int rds_grp_enable_mask;
442 int rds_buf_size;
443 char en_rds_change_filter;
444} ;
445
446struct hci_fm_en_avd_ctrl_req {
447 char no_freqs;
448 char freq_index;
449 char lo_shft;
450 short freq_min;
451 short freq_max;
452} ;
453
454struct hci_fm_def_data_rd_req {
455 char mode;
456 char length;
457 char param_len;
458 char param;
459} ;
460
461struct hci_fm_def_data_wr_req {
462 char mode;
463 char length;
464 char data[DEFAULT_DATA_SIZE];
465} ;
466
467struct hci_fm_riva_data {
468 char subopcode;
469 int start_addr;
470 char length;
471} ;
472
473struct hci_fm_riva_poke {
474 struct hci_fm_riva_data cmd_params;
475 char data[MAX_RIVA_PEEK_RSP_SIZE];
476} ;
477
478struct hci_fm_ssbi_req {
479 short start_addr;
480 char data;
481} ;
482struct hci_fm_ssbi_peek {
483 short start_address;
484} ;
485
486struct hci_fm_ch_det_threshold {
487 char sinr;
488 char sinr_samples;
489 char low_th;
490 char high_th;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700491} ;
492
493struct hci_fm_blend_table {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530494 char BlendType;
495 char BlendRampRateUp;
496 char BlendDebounceNumSampleUp;
497 char BlendDebounceIdxUp;
498 char BlendSinrIdxSkipStep;
499 char BlendSinrHi;
500 char BlendRmssiHi;
501 char BlendIndexHi;
502 char BlendIndex[MAX_BLEND_INDEX];
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700503} ;
504
Kamal Negi8813e0f2016-02-10 19:12:09 +0530505struct hci_fm_def_data_rd {
506 char mode;
507 char length;
508 char param_len;
509 char param;
510};
511
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700512/*HCI events*/
513#define HCI_EV_TUNE_STATUS 0x01
514#define HCI_EV_RDS_LOCK_STATUS 0x02
515#define HCI_EV_STEREO_STATUS 0x03
516#define HCI_EV_SERVICE_AVAILABLE 0x04
517#define HCI_EV_SEARCH_PROGRESS 0x05
518#define HCI_EV_SEARCH_RDS_PROGRESS 0x06
519#define HCI_EV_SEARCH_LIST_PROGRESS 0x07
520#define HCI_EV_RDS_RX_DATA 0x08
521#define HCI_EV_PROGRAM_SERVICE 0x09
522#define HCI_EV_RADIO_TEXT 0x0A
523#define HCI_EV_FM_AF_LIST 0x0B
524#define HCI_EV_TX_RDS_GRP_AVBLE 0x0C
525#define HCI_EV_TX_RDS_GRP_COMPL 0x0D
526#define HCI_EV_TX_RDS_CONT_GRP_COMPL 0x0E
527#define HCI_EV_CMD_COMPLETE 0x0F
528#define HCI_EV_CMD_STATUS 0x10
529#define HCI_EV_TUNE_COMPLETE 0x11
530#define HCI_EV_SEARCH_COMPLETE 0x12
531#define HCI_EV_SEARCH_RDS_COMPLETE 0x13
532#define HCI_EV_SEARCH_LIST_COMPLETE 0x14
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800533
534#define HCI_EV_EXT_COUNTRY_CODE 0x17
Satish kumar sugasib0ba3c82016-05-04 20:18:23 -0700535#define HCI_EV_RADIO_TEXT_PLUS_ID 0x18
536#define HCI_EV_RADIO_TEXT_PLUS_TAG 0x19
Satish kumar sugasi8a34ad32015-10-19 18:09:49 -0700537#define HCI_EV_HW_ERR_EVENT 0x1A
538
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700539#define HCI_REQ_DONE 0
540#define HCI_REQ_PEND 1
541#define HCI_REQ_CANCELED 2
542#define HCI_REQ_STATUS 3
543
544#define MAX_RAW_RDS_GRPS 21
545
546#define RDSGRP_DATA_OFFSET 0x1
547
548/*RT PLUS*/
549#define DUMMY_CLASS 0
550#define RT_PLUS_LEN_1_TAG 3
Kamal Negi8813e0f2016-02-10 19:12:09 +0530551#define RT_ERT_FLAG_BIT 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700552
553/*TAG1*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530554#define TAG1_MSB_OFFSET 3
555#define TAG1_MSB_MASK 7
556#define TAG1_LSB_OFFSET 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700557#define TAG1_POS_MSB_MASK 31
558#define TAG1_POS_MSB_OFFSET 1
559#define TAG1_POS_LSB_OFFSET 7
Kamal Negi8813e0f2016-02-10 19:12:09 +0530560#define TAG1_LEN_OFFSET 1
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700561#define TAG1_LEN_MASK 63
562
563/*TAG2*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530564#define TAG2_MSB_OFFSET 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700565#define TAG2_MSB_MASK 1
Kamal Negi8813e0f2016-02-10 19:12:09 +0530566#define TAG2_LSB_OFFSET 3
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700567#define TAG2_POS_MSB_MASK 7
568#define TAG2_POS_MSB_OFFSET 3
569#define TAG2_POS_LSB_OFFSET 5
570#define TAG2_LEN_MASK 31
571
572#define AGT_MASK 31
573/*Extract 5 left most bits of lsb of 2nd block*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530574#define AGT(x) (x & AGT_MASK)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700575/*16 bits of 4th block*/
576#define AID(lsb, msb) ((msb << 8) | (lsb))
577/*Extract 5 right most bits of msb of 2nd block*/
578#define GTC(blk2msb) (blk2msb >> 3)
579
580#define GRP_3A 0x6
581#define RT_PLUS_AID 0x4bd7
582
583/*ERT*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530584#define ERT_AID 0x6552
585#define CARRIAGE_RETURN 0x000D
586#define MAX_ERT_SEGMENT 31
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700587#define ERT_FORMAT_DIR_BIT 1
588
589#define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
590
591struct hci_ev_tune_status {
592 char sub_event;
593 int station_freq;
594 char serv_avble;
595 char rssi;
596 char stereo_prg;
597 char rds_sync_status;
598 char mute_mode;
599 char sinr;
600 char intf_det_th;
601} ;
602
603struct rds_blk_data {
604 char rdsMsb;
605 char rdsLsb;
606 char blockStatus;
607} ;
608
609struct rds_grp_data {
610 struct rds_blk_data rdsBlk[4];
611} ;
612
613struct hci_ev_rds_rx_data {
614 char num_rds_grps;
615 struct rds_grp_data rds_grp_data[MAX_RAW_RDS_GRPS];
616} ;
617
618struct hci_ev_prg_service {
619 short pi_prg_id;
620 char pty_prg_type;
621 char ta_prg_code_type;
622 char ta_ann_code_flag;
623 char ms_switch_code_flag;
624 char dec_id_ctrl_code_flag;
625 char ps_num;
626 char prg_service_name[119];
627} ;
628
629struct hci_ev_radio_text {
630 short pi_prg_id;
631 char pty_prg_type;
632 char ta_prg_code_type;
633 char txt_ab_flag;
634 char radio_txt[64];
635} ;
636
637struct hci_ev_af_list {
638 int tune_freq;
639 short pi_code;
640 char af_size;
641 char af_list[FM_AF_LIST_MAX_SIZE];
642} ;
643
644struct hci_ev_cmd_complete {
645 char num_hci_cmd_pkts;
646 short cmd_opcode;
647} ;
648
649struct hci_ev_cmd_status {
650 char status;
651 char num_hci_cmd_pkts;
652 short status_opcode;
653} ;
654
655struct hci_ev_srch_st {
656 int station_freq;
657 char rds_cap;
658 char pty;
659 short status_opcode;
660} ;
661
662struct hci_ev_rel_freq {
663 char rel_freq_msb;
664 char rel_freq_lsb;
665
666} ;
667struct hci_ev_srch_list_compl {
668 char num_stations_found;
669 struct hci_ev_rel_freq rel_freq[20];
670} ;
671
672/* ----- HCI Event Response ----- */
673struct hci_fm_conf_rsp {
674 char status;
675 struct hci_fm_recv_conf_req recv_conf_rsp;
676} ;
677
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700678struct hci_fm_rds_grp_cntrs_rsp {
679 char status;
680 struct hci_fm_rds_grp_cntrs_params recv_rds_grp_cntrs_rsp;
681} ;
682
683
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700684struct hci_fm_get_trans_conf_rsp {
685 char status;
686 struct hci_fm_trans_conf_req_struct trans_conf_rsp;
687} ;
688struct hci_fm_sig_threshold_rsp {
689 char status;
690 char sig_threshold;
691} ;
692
693struct hci_fm_station_rsp {
694 struct hci_ev_tune_status station_rsp;
695} ;
696
697struct hci_fm_prgm_srv_rsp {
698 char status;
699 struct hci_ev_prg_service prg_srv;
700} ;
701
702struct hci_fm_radio_txt_rsp {
703 char status;
704 struct hci_ev_radio_text rd_txt;
705} ;
706
707struct hci_fm_af_list_rsp {
708 char status;
709 struct hci_ev_af_list rd_txt;
710} ;
711
712struct hci_fm_data_rd_rsp {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530713 char data_len;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700714 char data[DEFAULT_DATA_SIZE];
715} ;
716
717struct hci_fm_feature_list_rsp {
718 char status;
719 char feature_mask;
720} ;
721
722struct hci_fm_dbg_param_rsp {
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700723 char blend;
724 char soft_mute;
725 char inf_blend;
726 char inf_soft_mute;
727 char pilot_pil;
728 char io_verc;
729 char in_det_out;
730} ;
731
Kamal Negi8813e0f2016-02-10 19:12:09 +0530732#define CLKSPURID_INDEX0 0
733#define CLKSPURID_INDEX1 5
734#define CLKSPURID_INDEX2 10
735#define CLKSPURID_INDEX3 15
736#define CLKSPURID_INDEX4 20
737#define CLKSPURID_INDEX5 25
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700738
Kamal Negi8813e0f2016-02-10 19:12:09 +0530739#define MAX_SPUR_FREQ_LIMIT 30
740#define CKK_SPUR 0x3B
741#define SPUR_DATA_SIZE 0x4
742#define SPUR_ENTRIES_PER_ID 0x5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700743
744#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
745#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
746#define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
747
748struct hci_fm_spur_data {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530749 int freq[MAX_SPUR_FREQ_LIMIT];
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700750 char rmssi[MAX_SPUR_FREQ_LIMIT];
751 char enable[MAX_SPUR_FREQ_LIMIT];
752} ;
753
754
755/* HCI dev events */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530756#define RADIO_HCI_DEV_REG 1
757#define RADIO_HCI_DEV_WRITE 2
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700758
Kamal Negi8813e0f2016-02-10 19:12:09 +0530759#define hci_req_lock(d) mutex_lock(&d->req_lock)
760#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700761
762/* FM RDS */
763#define RDS_PTYPE 2
764#define RDS_PID_LOWER 1
765#define RDS_PID_HIGHER 0
766#define RDS_OFFSET 5
767#define RDS_PS_LENGTH_OFFSET 7
768#define RDS_STRING 8
769#define RDS_PS_DATA_OFFSET 8
770#define RDS_CONFIG_OFFSET 3
771#define RDS_AF_JUMP_OFFSET 4
772#define PI_CODE_OFFSET 4
773#define AF_SIZE_OFFSET 6
774#define AF_LIST_OFFSET 7
775#define RT_A_B_FLAG_OFFSET 4
776/*FM states*/
777
778enum radio_state_t {
779 FM_OFF,
780 FM_RECV,
781 FM_TRANS,
782 FM_RESET,
783 FM_CALIB,
784 FM_TURNING_OFF,
785 FM_RECV_TURNING_ON,
786 FM_TRANS_TURNING_ON,
787 FM_MAX_NO_STATES,
788};
789
790enum emphasis_type {
791 FM_RX_EMP75 = 0x0,
792 FM_RX_EMP50 = 0x1
793};
794
795enum channel_space_type {
796 FM_RX_SPACE_200KHZ = 0x0,
797 FM_RX_SPACE_100KHZ = 0x1,
798 FM_RX_SPACE_50KHZ = 0x2
799};
800
801enum high_low_injection {
802 AUTO_HI_LO_INJECTION = 0x0,
803 LOW_SIDE_INJECTION = 0x1,
804 HIGH_SIDE_INJECTION = 0x2
805};
806
807enum fm_rds_type {
808 FM_RX_RDBS_SYSTEM = 0x0,
809 FM_RX_RDS_SYSTEM = 0x1
810};
811
812enum hlm_region_t {
813 HELIUM_REGION_US,
814 HELIUM_REGION_EU,
815 HELIUM_REGION_JAPAN,
816 HELIUM_REGION_JAPAN_WIDE,
817 HELIUM_REGION_OTHER
818};
819
820/* Search options */
821enum search_t {
822 SEEK,
823 SCAN,
824 SCAN_FOR_STRONG,
825 SCAN_FOR_WEAK,
826 RDS_SEEK_PTY,
827 RDS_SCAN_PTY,
828 RDS_SEEK_PI,
829 RDS_AF_JUMP,
830};
831
832enum spur_entry_levels {
833 ENTRY_0,
834 ENTRY_1,
835 ENTRY_2,
836 ENTRY_3,
837 ENTRY_4,
838 ENTRY_5,
839};
840
841/* Band limits */
842#define REGION_US_EU_BAND_LOW 87500
843#define REGION_US_EU_BAND_HIGH 108000
844#define REGION_JAPAN_STANDARD_BAND_LOW 76000
845#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
846#define REGION_JAPAN_WIDE_BAND_LOW 90000
847#define REGION_JAPAN_WIDE_BAND_HIGH 108000
848
849#define SRCH_MODE 0x07
850#define SRCH_DIR 0x08 /* 0-up 1-down */
851#define SCAN_DWELL 0x70
Kamal Negi8813e0f2016-02-10 19:12:09 +0530852#define SRCH_ON 0x80
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700853
854/* I/O Control */
855#define IOC_HRD_MUTE 0x03
856#define IOC_SFT_MUTE 0x01
857#define IOC_MON_STR 0x01
858#define IOC_SIG_BLND 0x01
859#define IOC_INTF_BLND 0x01
860#define IOC_ANTENNA 0x01
861
862/* RDS Control */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530863#define RDS_ON 0x01
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700864#define RDS_BUF_SZ 100
865
866/* constants */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530867#define RDS_BLOCKS_NUM (4)
868#define BYTES_PER_BLOCK (3)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700869#define MAX_PS_LENGTH (108)
870#define MAX_RT_LENGTH (64)
871#define RDS_GRP_CNTR_LEN (36)
872#define RX_RT_DATA_LENGTH (63)
873/* Search direction */
874#define SRCH_DIR_UP (0)
875#define SRCH_DIR_DOWN (1)
876
877/*Search RDS stations*/
878#define SEARCH_RDS_STNS_MODE_OFFSET 4
879
880/*Search Station list */
881#define PARAMS_PER_STATION 0x08
882#define STN_NUM_OFFSET 0x01
883#define STN_FREQ_OFFSET 0x02
884#define KHZ_TO_MHZ 1000
885#define GET_MSB(x)((x >> 8) & 0xFF)
886#define GET_LSB(x)((x) & 0xFF)
887
888/* control options */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530889#define CTRL_ON (1)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700890#define CTRL_OFF (0)
891
892/*Diagnostic commands*/
893
894#define RIVA_PEEK_OPCODE 0x0D
895#define RIVA_POKE_OPCODE 0x0C
896
897#define PEEK_DATA_OFSET 0x1
898#define RIVA_PEEK_PARAM 0x6
899#define RIVA_PEEK_LEN_OFSET 0x6
900#define SSBI_PEEK_LEN 0x01
901/*Calibration data*/
902#define PROCS_CALIB_MODE 1
903#define PROCS_CALIB_SIZE 23
904#define DC_CALIB_MODE 2
905#define DC_CALIB_SIZE 48
906#define RSB_CALIB_MODE 3
907#define RSB_CALIB_SIZE 4
908#define CALIB_DATA_OFSET 2
909#define CALIB_MODE_OFSET 1
910#define MAX_CALIB_SIZE 75
911
912/* Channel validity */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530913#define INVALID_CHANNEL (0)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700914#define VALID_CHANNEL (1)
915
916struct hci_fm_set_cal_req_proc {
917 char mode;
918 /*Max process calibration data size*/
919 char data[PROCS_CALIB_SIZE];
920} ;
921
922struct hci_fm_set_cal_req_dc {
923 char mode;
924 /*Max DC calibration data size*/
925 char data[DC_CALIB_SIZE];
926} ;
927
928struct hci_cc_do_calibration_rsp {
929 char status;
930 char mode;
931 char data[MAX_CALIB_SIZE];
932} ;
933
934struct hci_fm_set_spur_table_req {
935 char mode;
936 char no_of_freqs_entries;
937 char spur_data[FM_SPUR_TBL_SIZE];
938} ;
939/* Low Power mode*/
940#define SIG_LEVEL_INTR (1 << 0)
941#define RDS_SYNC_INTR (1 << 1)
942#define AUDIO_CTRL_INTR (1 << 2)
943#define AF_JUMP_ENABLE (1 << 4)
944
945int hci_def_data_read(struct hci_fm_def_data_rd_req *arg,
946 struct radio_hci_dev *hdev);
947int hci_def_data_write(struct hci_fm_def_data_wr_req *arg,
948 struct radio_hci_dev *hdev);
949int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
950int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
951
952static inline int is_valid_tone(int tone)
953{
954 if ((tone >= MIN_TX_TONE_VAL) &&
955 (tone <= MAX_TX_TONE_VAL))
956 return 1;
957 else
958 return 0;
959}
960
961static inline int is_valid_hard_mute(int hard_mute)
962{
963 if ((hard_mute >= MIN_HARD_MUTE_VAL) &&
964 (hard_mute <= MAX_HARD_MUTE_VAL))
965 return 1;
966 else
967 return 0;
968}
969
970static inline int is_valid_srch_mode(int srch_mode)
971{
972 if ((srch_mode >= MIN_SRCH_MODE) &&
973 (srch_mode <= MAX_SRCH_MODE))
974 return 1;
975 else
976 return 0;
977}
978
979static inline int is_valid_scan_dwell_prd(int scan_dwell_prd)
980{
981 if ((scan_dwell_prd >= MIN_SCAN_DWELL) &&
982 (scan_dwell_prd <= MAX_SCAN_DWELL))
983 return 1;
984 else
985 return 0;
986}
987
988static inline int is_valid_sig_th(int sig_th)
989{
990 if ((sig_th >= MIN_SIG_TH) &&
991 (sig_th <= MAX_SIG_TH))
992 return 1;
993 else
994 return 0;
995}
996
997static inline int is_valid_pty(int pty)
998{
999 if ((pty >= MIN_PTY) &&
1000 (pty <= MAX_PTY))
1001 return 1;
1002 else
1003 return 0;
1004}
1005
1006static inline int is_valid_pi(int pi)
1007{
1008 if ((pi >= MIN_PI) &&
1009 (pi <= MAX_PI))
1010 return 1;
1011 else
1012 return 0;
1013}
1014
1015static inline int is_valid_srch_station_cnt(int cnt)
1016{
1017 if ((cnt >= MIN_SRCH_STATIONS_CNT) &&
1018 (cnt <= MAX_SRCH_STATIONS_CNT))
1019 return 1;
1020 else
1021 return 0;
1022}
1023
1024static inline int is_valid_chan_spacing(int spacing)
1025{
1026 if ((spacing >= MIN_CHAN_SPACING) &&
1027 (spacing <= MAX_CHAN_SPACING))
1028 return 1;
1029 else
1030 return 0;
1031}
1032
1033static inline int is_valid_emphasis(int emphasis)
1034{
1035 if ((emphasis >= MIN_EMPHASIS) &&
1036 (emphasis <= MAX_EMPHASIS))
1037 return 1;
1038 else
1039 return 0;
1040}
1041
1042static inline int is_valid_rds_std(int rds_std)
1043{
1044 if ((rds_std >= MIN_RDS_STD) &&
1045 (rds_std <= MAX_RDS_STD))
1046 return 1;
1047 else
1048 return 0;
1049}
1050
1051static inline int is_valid_antenna(int antenna_type)
1052{
1053 if ((antenna_type >= MIN_ANTENNA_VAL) &&
1054 (antenna_type <= MAX_ANTENNA_VAL))
1055 return 1;
1056 else
1057 return 0;
1058}
1059
1060static inline int is_valid_ps_repeat_cnt(int cnt)
1061{
1062 if ((cnt >= MIN_TX_PS_REPEAT_CNT) &&
1063 (cnt <= MAX_TX_PS_REPEAT_CNT))
1064 return 1;
1065 else
1066 return 0;
1067}
1068
1069static inline int is_valid_soft_mute(int soft_mute)
1070{
1071 if ((soft_mute >= MIN_SOFT_MUTE) &&
1072 (soft_mute <= MAX_SOFT_MUTE))
1073 return 1;
1074 else
1075 return 0;
1076}
1077
1078static inline int is_valid_peek_len(int len)
1079{
1080 if ((len >= MIN_PEEK_ACCESS_LEN) &&
1081 (len <= MAX_PEEK_ACCESS_LEN))
1082 return 1;
1083 else
1084 return 0;
1085}
1086
1087static inline int is_valid_reset_cntr(int cntr)
1088{
1089 if ((cntr >= MIN_RESET_CNTR) &&
1090 (cntr <= MAX_RESET_CNTR))
1091 return 1;
1092 else
1093 return 0;
1094}
1095
1096static inline int is_valid_hlsi(int hlsi)
1097{
1098 if ((hlsi >= MIN_HLSI) &&
1099 (hlsi <= MAX_HLSI))
1100 return 1;
1101 else
1102 return 0;
1103}
1104
1105static inline int is_valid_notch_filter(int filter)
1106{
1107 if ((filter >= MIN_NOTCH_FILTER) &&
1108 (filter <= MAX_NOTCH_FILTER))
1109 return 1;
1110 else
1111 return 0;
1112}
1113
1114static inline int is_valid_intf_det_low_th(int th)
1115{
1116 if ((th >= MIN_INTF_DET_OUT_LW_TH) &&
1117 (th <= MAX_INTF_DET_OUT_LW_TH))
1118 return 1;
1119 else
1120 return 0;
1121}
1122
1123static inline int is_valid_intf_det_hgh_th(int th)
1124{
1125 if ((th >= MIN_INTF_DET_OUT_HG_TH) &&
1126 (th <= MAX_INTF_DET_OUT_HG_TH))
1127 return 1;
1128 else
1129 return 0;
1130}
1131
1132static inline int is_valid_sinr_th(int th)
1133{
1134 if ((th >= MIN_SINR_TH) &&
1135 (th <= MAX_SINR_TH))
1136 return 1;
1137 else
1138 return 0;
1139}
1140
1141static inline int is_valid_sinr_samples(int samples_cnt)
1142{
1143 if ((samples_cnt >= MIN_SINR_SAMPLES) &&
1144 (samples_cnt <= MAX_SINR_SAMPLES))
1145 return 1;
1146 else
1147 return 0;
1148}
1149
1150static inline int is_valid_fm_state(int state)
1151{
1152 if ((state >= 0) && (state < FM_MAX_NO_STATES))
1153 return 1;
1154 else
1155 return 0;
1156}
1157
1158static inline int is_valid_blend_value(int val)
1159{
1160 if ((val >= MIN_BLEND_HI) && (val <= MAX_BLEND_HI))
1161 return 1;
1162 else
1163 return 0;
1164}
1165
1166struct helium_device {
1167 int tune_req;
1168 unsigned int mode;
1169 short pi;
1170 char pty;
1171 char ps_repeatcount;
1172 char prev_trans_rds;
1173 char af_jump_bit;
1174 struct hci_fm_mute_mode_req mute_mode;
1175 struct hci_fm_stereo_mode_req stereo_mode;
1176 struct hci_fm_station_rsp fm_st_rsp;
1177 struct hci_fm_search_station_req srch_st;
1178 struct hci_fm_search_rds_station_req srch_rds;
1179 struct hci_fm_search_station_list_req srch_st_list;
1180 struct hci_fm_recv_conf_req recv_conf;
1181 struct hci_fm_trans_conf_req_struct trans_conf;
1182 struct hci_fm_rds_grp_req rds_grp;
1183 unsigned char g_search_mode;
1184 unsigned char power_mode;
1185 int search_on;
1186 unsigned char spur_table_size;
1187 unsigned char g_scan_time;
1188 unsigned int g_antenna;
1189 unsigned int g_rds_grp_proc_ps;
1190 unsigned char event_mask;
1191 enum hlm_region_t region;
1192 struct hci_fm_dbg_param_rsp st_dbg_param;
1193 struct hci_ev_srch_list_compl srch_st_result;
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001194 struct hci_fm_riva_poke riva_data_req;
1195 struct hci_fm_ssbi_req ssbi_data_accs;
1196 struct hci_fm_ssbi_peek ssbi_peek_reg;
1197 struct hci_fm_ch_det_threshold ch_det_threshold;
Kamal Negi8813e0f2016-02-10 19:12:09 +05301198 struct hci_fm_data_rd_rsp def_data;
1199 struct hci_fm_blend_table blend_tbl;
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001200};
Kamal Negi8813e0f2016-02-10 19:12:09 +05301201
1202#define set_bit(flag, bit_pos) ((flag) |= (1 << (bit_pos)))
1203#define clear_bit(flag, bit_pos) ((flag) &= (~(1 << (bit_pos))))
1204#define test_bit(flag, bit_pos) ((flag) & (1 << (bit_pos)))
1205#define clear_all_bit(flag) ((flag) &= (~0xFFFFFFFF))
1206#define CMD_CHDET_SINR_TH (1)
1207#define CMD_CHDET_SINR_SAMPLE (2)
1208#define CMD_CHDET_INTF_TH_LOW (3)
1209#define CMD_CHDET_INTF_TH_HIGH (4)
1210
1211#define CMD_DEFRD_AF_RMSSI_TH (1)
1212#define CMD_DEFRD_AF_RMSSI_SAMPLE (2)
1213#define CMD_DEFRD_GD_CH_RMSSI_TH (3)
1214#define CMD_DEFRD_SEARCH_ALGO (4)
1215#define CMD_DEFRD_SINR_FIRST_STAGE (5)
1216#define CMD_DEFRD_RMSSI_FIRST_STAGE (6)
1217#define CMD_DEFRD_CF0TH12 (7)
1218#define CMD_DEFRD_TUNE_POWER (8)
1219#define CMD_DEFRD_REPEATCOUNT (9)
1220
1221#define CMD_STNPARAM_RSSI (1)
1222#define CMD_STNPARAM_SINR (2)
1223#define CMD_STNPARAM_INTF_DET_TH (3)
1224
1225#define CMD_STNDBGPARAM_BLEND (1)
1226#define CMD_STNDBGPARAM_SOFTMUTE (2)
1227#define CMD_STNDBGPARAM_INFBLEND (3)
1228#define CMD_STNDBGPARAM_INFSOFTMUTE (4)
1229#define CMD_STNDBGPARAM_PILOTPLL (5)
1230#define CMD_STNDBGPARAM_IOVERC (6)
1231#define CMD_STNDBGPARAM_INFDETOUT (7)
1232
1233#define CMD_BLENDTBL_SINR_HI (1)
1234#define CMD_BLENDTBL_RMSSI_HI (2)
1235
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001236int hci_fm_disable_recv_req();
1237int helium_search_list(struct hci_fm_search_station_list_req *s_list);
1238int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch);
1239int helium_search_stations(struct hci_fm_search_station_req *srch);
1240int helium_cancel_search_req();
1241int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf);
1242int hci_fm_get_program_service_req ();
1243int hci_fm_get_rds_grpcounters_req (int val);
1244int hci_fm_set_notch_filter_req (int val);
1245int helium_set_sig_threshold_req(char th);
1246int helium_rds_grp_mask_req(struct hci_fm_rds_grp_req *rds_grp_msk);
1247int helium_rds_grp_process_req(int rds_grp);
1248int helium_set_event_mask_req(char e_mask);
1249int helium_set_antenna_req(char ant);
1250int helium_set_fm_mute_mode_req(struct hci_fm_mute_mode_req *mute);
1251int hci_fm_tune_station_req(int param);
1252int hci_set_fm_stereo_mode_req(struct hci_fm_stereo_mode_req *param);
1253int hci_peek_data(struct hci_fm_riva_data *data);
1254int hci_poke_data(struct hci_fm_riva_poke *data);
1255int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data);
1256int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data);
1257int hci_fm_get_ch_det_th();
1258int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th);
Kamal Negi8813e0f2016-02-10 19:12:09 +05301259int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd);
1260int hci_fm_get_blend_req();
1261int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl);
1262int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt);
1263int hci_fm_get_station_dbg_param_req();
1264int hci_fm_get_station_cmd_param_req();
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001265
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001266#endif /* __UAPI_RADIO_HCI_CORE_H */