blob: 200e006a5a3ade465a11cedef393c2479d256dc1 [file] [log] [blame]
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001/*
Kamal Negi8a2a72a2016-06-30 11:43:32 +05302Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
Satish kumar sugasi644b4882016-05-04 20:15:31 -07003
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
Kamal Negi8a2a72a2016-06-30 11:43:32 +053030#ifndef __RADIO_HELIUM_H__
31#define __RADIO_HELIUM_H__
Satish kumar sugasi644b4882016-05-04 20:15:31 -070032
33#include <stdbool.h>
34
Satish kumar sugasi644b4882016-05-04 20:15:31 -070035#define MIN_TX_TONE_VAL 0x00
36#define MAX_TX_TONE_VAL 0x07
37#define MIN_HARD_MUTE_VAL 0x00
38#define MAX_HARD_MUTE_VAL 0x03
39#define MIN_SRCH_MODE 0x00
40#define MAX_SRCH_MODE 0x09
41#define MIN_SCAN_DWELL 0x00
42#define MAX_SCAN_DWELL 0x0F
43#define MIN_SIG_TH 0x00
44#define MAX_SIG_TH 0x03
45#define MIN_PTY 0X00
46#define MAX_PTY 0x1F
47#define MIN_PI 0x0000
48#define MAX_PI 0xFFFF
49#define MIN_SRCH_STATIONS_CNT 0x00
50#define MAX_SRCH_STATIONS_CNT 0x14
51#define MIN_CHAN_SPACING 0x00
52#define MAX_CHAN_SPACING 0x02
53#define MIN_EMPHASIS 0x00
54#define MAX_EMPHASIS 0x01
55#define MIN_RDS_STD 0x00
56#define MAX_RDS_STD 0x02
57#define MIN_ANTENNA_VAL 0x00
58#define MAX_ANTENNA_VAL 0x01
59#define MIN_TX_PS_REPEAT_CNT 0x01
60#define MAX_TX_PS_REPEAT_CNT 0x0F
61#define MIN_SOFT_MUTE 0x00
62#define MAX_SOFT_MUTE 0x01
63#define MIN_PEEK_ACCESS_LEN 0x01
64#define MAX_PEEK_ACCESS_LEN 0xF9
65#define MIN_RESET_CNTR 0x00
66#define MAX_RESET_CNTR 0x01
67#define MIN_HLSI 0x00
68#define MAX_HLSI 0x02
69#define MIN_NOTCH_FILTER 0x00
70#define MAX_NOTCH_FILTER 0x02
71#define MIN_INTF_DET_OUT_LW_TH 0x00
72#define MAX_INTF_DET_OUT_LW_TH 0xFF
73#define MIN_INTF_DET_OUT_HG_TH 0x00
74#define MAX_INTF_DET_OUT_HG_TH 0xFF
75#define MIN_SINR_TH -128
76#define MAX_SINR_TH 127
77#define MIN_SINR_SAMPLES 0x01
78#define MAX_SINR_SAMPLES 0xFF
79#define MIN_BLEND_HI -128
80#define MAX_BLEND_HI 127
81
Satish kumar sugasi644b4882016-05-04 20:15:31 -070082/* HCI data types */
83#define RADIO_HCI_COMMAND_PKT 0x11
84#define RADIO_HCI_EVENT_PKT 0x14
85/*HCI reponce packets*/
86#define MAX_RIVA_PEEK_RSP_SIZE 251
87/* default data access */
88#define DEFAULT_DATA_OFFSET 2
89#define DEFAULT_DATA_SIZE 249
90/* Power levels are 0-7, but SOC will expect values from 0-255
91 * So the each level step size will be 255/7 = 36 */
92#define FM_TX_PWR_LVL_STEP_SIZE 36
93#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
94#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
95#define FM_TX_PHY_CFG_MODE 0x3c
96#define FM_TX_PHY_CFG_LEN 0x10
97#define FM_TX_PWR_GAIN_OFFSET 14
98/**RDS CONFIG MODE**/
Kamal Negi8813e0f2016-02-10 19:12:09 +053099#define FM_RDS_CNFG_MODE 0x0f
100#define FM_RDS_CNFG_LEN 0x10
101#define AF_RMSSI_TH_OFFSET 1
102#define AF_RMSSI_SAMPLES_OFFSET 2
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700103/**RX CONFIG MODE**/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530104#define FM_RX_CONFG_MODE 0x15
105#define FM_RX_CNFG_LEN 0x15
106#define GD_CH_RMSSI_TH_OFFSET 0x03
107#define MAX_GD_CH_RMSSI_TH 0x7F
108#define SRCH_ALGO_TYPE_OFFSET 0x00
109#define SINRFIRSTSTAGE_OFFSET 0x01
110#define RMSSIFIRSTSTAGE_OFFSET 0x02
111#define CF0TH12_BYTE1_OFFSET 0x03
112#define CF0TH12_BYTE2_OFFSET 0x04
113#define MAX_SINR_FIRSTSTAGE 0x7F
114#define MAX_RMSSI_FIRSTSTAGE 0x7F
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700115#define RDS_PS0_XFR_MODE 0x01
Kamal Negi8813e0f2016-02-10 19:12:09 +0530116#define RDS_PS0_LEN 0x06
117#define RX_REPEATE_BYTE_OFFSET 0x05
118#define FM_SPUR_TBL_SIZE 0xF0
119#define SPUR_DATA_LEN 0x10
120#define ENTRIES_EACH_CMD 0x0F
121#define SPUR_DATA_INDEX 0x02
122#define FM_AF_LIST_MAX_SIZE 0xC8
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700123#define AF_LIST_MAX (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist
Kamal Negi8813e0f2016-02-10 19:12:09 +0530124 of sizeof(int) bytes */
125#define MAX_BLEND_INDEX 0x31
126
127#define FM_SRCH_CONFG_MODE 0x41
128#define FM_AFJUMP_CONFG_MODE 0x42
129#define FM_SRCH_CNFG_LEN 0x08
130#define FM_AFJUMP_CNFG_LEN 0x06
131
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700132/* HCI timeouts */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530133#define RADIO_HCI_TIMEOUT (10000) /* 10 seconds */
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700134
Satish kumar sugasibf9558e2016-05-10 14:30:17 -0700135#define ECC_EVENT_BUFSIZE 12
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700136typedef enum {
137 ASSOCIATE_JVM,
138 DISASSOCIATE_JVM
139} bt_cb_thread_evt;
140
141#define TUNE_PARAM 16
142#define SIZE_ARRAY(x) (sizeof(x) / sizeof((x)[0]))
143typedef void (*enb_result_cb)();
144typedef void (*tune_rsp_cb)(int Freq);
145typedef void (*seek_rsp_cb)(int Freq);
146typedef void (*scan_rsp_cb)();
147typedef void (*srch_list_rsp_cb)(uint16_t *scan_tbl);
148typedef void (*stereo_mode_cb)(bool status);
149typedef void (*rds_avl_sts_cb)(bool status);
150typedef void (*af_list_cb)(uint16_t *af_list);
151typedef void (*rt_cb)(char *rt);
152typedef void (*ps_cb)(char *ps);
153typedef void (*oda_cb)();
154typedef void (*rt_plus_cb)(char *rt_plus);
155typedef void (*ert_cb)(char *ert);
156typedef void (*disable_cb)();
157typedef void (*callback_thread_event)(unsigned int evt);
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700158typedef void (*rds_grp_cntrs_cb)(char *rds_params);
Satish kumar sugasi649b9902016-04-28 17:55:29 -0700159typedef void (*rds_grp_cntrs_ext_cb)(char *rds_params);
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800160typedef void (*fm_peek_cb)(char *peek_rsp);
161typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
Smriti Gupta12ee3312016-05-11 15:43:14 +0530162typedef void (*fm_agc_gain_cb)(char *agc_gain_rsp);
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800163typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800164typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
Kamal Negi8813e0f2016-02-10 19:12:09 +0530165typedef void (*fm_sig_thr_cb) (int val, int status);
166typedef void (*fm_get_ch_det_thrs_cb) (int val, int status);
167typedef void (*fm_def_data_rd_cb) (int val, int status);
168typedef void (*fm_get_blnd_cb) (int val, int status);
169typedef void (*fm_set_ch_det_thrs_cb) (int status);
170typedef void (*fm_def_data_wrt_cb) (int status);
171typedef void (*fm_set_blnd_cb) (int status);
172typedef void (*fm_get_stn_prm_cb) (int val, int status);
173typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700174
175typedef struct {
176 size_t size;
177
178 enb_result_cb enabled_cb;
179 tune_rsp_cb tune_cb;
180 seek_rsp_cb seek_cmpl_cb;
181 scan_rsp_cb scan_next_cb;
182 srch_list_rsp_cb srch_list_cb;
183 stereo_mode_cb stereo_status_cb;
184 rds_avl_sts_cb rds_avail_status_cb;
185 af_list_cb af_list_update_cb;
186 rt_cb rt_update_cb;
187 ps_cb ps_update_cb;
188 oda_cb oda_update_cb;
189 rt_plus_cb rt_plus_update_cb;
190 ert_cb ert_update_cb;
191 disable_cb disabled_cb;
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700192 rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530193 rds_grp_cntrs_ext_cb rds_grp_cntrs_ext_rsp_cb;
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800194 fm_peek_cb fm_peek_rsp_cb;
195 fm_ssbi_peek_cb fm_ssbi_peek_rsp_cb;
Smriti Gupta12ee3312016-05-11 15:43:14 +0530196 fm_agc_gain_cb fm_agc_gain_rsp_cb;
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800197 fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530198 fm_ecc_evt_cb ext_country_code_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700199 callback_thread_event thread_evt_cb;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530200 fm_sig_thr_cb fm_get_sig_thres_cb;
201 fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb;
202 fm_def_data_rd_cb fm_def_data_read_cb;
203 fm_get_blnd_cb fm_get_blend_cb;
204 fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb;
205 fm_def_data_wrt_cb fm_def_data_write_cb;
206 fm_set_blnd_cb fm_set_blend_cb;
207 fm_get_stn_prm_cb fm_get_station_param_cb;
208 fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530209} fm_hal_callbacks_t;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700210
211/* Opcode OCF */
212/* HCI recv control commands opcode */
213#define HCI_OCF_FM_ENABLE_RECV_REQ 0x0001
214#define HCI_OCF_FM_DISABLE_RECV_REQ 0x0002
215#define HCI_OCF_FM_GET_RECV_CONF_REQ 0x0003
216#define HCI_OCF_FM_SET_RECV_CONF_REQ 0x0004
217#define HCI_OCF_FM_SET_MUTE_MODE_REQ 0x0005
218#define HCI_OCF_FM_SET_STEREO_MODE_REQ 0x0006
219#define HCI_OCF_FM_SET_ANTENNA 0x0007
220#define HCI_OCF_FM_SET_SIGNAL_THRESHOLD 0x0008
221#define HCI_OCF_FM_GET_SIGNAL_THRESHOLD 0x0009
222#define HCI_OCF_FM_GET_STATION_PARAM_REQ 0x000A
223#define HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ 0x000B
224#define HCI_OCF_FM_GET_RADIO_TEXT_REQ 0x000C
225#define HCI_OCF_FM_GET_AF_LIST_REQ 0x000D
226#define HCI_OCF_FM_SEARCH_STATIONS 0x000E
227#define HCI_OCF_FM_SEARCH_RDS_STATIONS 0x000F
228#define HCI_OCF_FM_SEARCH_STATIONS_LIST 0x0010
229#define HCI_OCF_FM_CANCEL_SEARCH 0x0011
230#define HCI_OCF_FM_RDS_GRP 0x0012
231#define HCI_OCF_FM_RDS_GRP_PROCESS 0x0013
232#define HCI_OCF_FM_EN_WAN_AVD_CTRL 0x0014
233#define HCI_OCF_FM_EN_NOTCH_CTRL 0x0015
234#define HCI_OCF_FM_SET_EVENT_MASK 0x0016
235#define HCI_OCF_FM_SET_CH_DET_THRESHOLD 0x0017
236#define HCI_OCF_FM_GET_CH_DET_THRESHOLD 0x0018
237#define HCI_OCF_FM_SET_BLND_TBL 0x001B
238#define HCI_OCF_FM_GET_BLND_TBL 0x001C
Kiran Kelagericad71712016-04-27 16:54:22 -0700239#define HCI_OCF_FM_LOW_PASS_FILTER_CTRL 0x001F
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700240/* HCI trans control commans opcode*/
241#define HCI_OCF_FM_ENABLE_TRANS_REQ 0x0001
242#define HCI_OCF_FM_DISABLE_TRANS_REQ 0x0002
243#define HCI_OCF_FM_GET_TRANS_CONF_REQ 0x0003
244#define HCI_OCF_FM_SET_TRANS_CONF_REQ 0x0004
245#define HCI_OCF_FM_RDS_RT_REQ 0x0008
246#define HCI_OCF_FM_RDS_PS_REQ 0x0009
247
Kamal Negice09c302016-12-29 16:45:38 +0530248#define HCI_OCF_FM_ENABLE_SLIMBUS (0x000E)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700249
250/* HCI common control commands opcode */
251#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
252#define HCI_OCF_FM_DEFAULT_DATA_READ 0x0002
253#define HCI_OCF_FM_DEFAULT_DATA_WRITE 0x0003
254#define HCI_OCF_FM_RESET 0x0004
255#define HCI_OCF_FM_GET_FEATURE_LIST 0x0005
256#define HCI_OCF_FM_DO_CALIBRATION 0x0006
257#define HCI_OCF_FM_SET_CALIBRATION 0x0007
258#define HCI_OCF_FM_SET_SPUR_TABLE 0x0008
259#define HCI_OCF_FM_GET_SPUR_TABLE 0x0009
260
261/*HCI Status parameters commands*/
262#define HCI_OCF_FM_READ_GRP_COUNTERS 0x0001
263
Satish kumar sugasi649b9902016-04-28 17:55:29 -0700264#define HCI_OCF_FM_READ_GRP_COUNTERS_EXT 0x0002
265
266
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700267/*HCI Diagnostic commands*/
268#define HCI_OCF_FM_PEEK_DATA 0x0002
269#define HCI_OCF_FM_POKE_DATA 0x0003
270#define HCI_OCF_FM_SSBI_PEEK_REG 0x0004
271#define HCI_OCF_FM_SSBI_POKE_REG 0x0005
272#define HCI_OCF_FM_STATION_DBG_PARAM 0x0007
273#define HCI_FM_SET_INTERNAL_TONE_GENRATOR 0x0008
Smriti Gupta12ee3312016-05-11 15:43:14 +0530274#define HCI_FM_SET_GET_RESET_AGC 0x000D
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700275
276/* Opcode OGF */
277#define HCI_OGF_FM_RECV_CTRL_CMD_REQ 0x0013
278#define HCI_OGF_FM_TRANS_CTRL_CMD_REQ 0x0014
279#define HCI_OGF_FM_COMMON_CTRL_CMD_REQ 0x0015
280#define HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ 0x0016
281#define HCI_OGF_FM_TEST_CMD_REQ 0x0017
282#define HCI_OGF_FM_DIAGNOSTIC_CMD_REQ 0x003F
283
284/* Command opcode pack/unpack */
Smriti Gupta12ee3312016-05-11 15:43:14 +0530285#define hci_opcode_pack(ogf, ocf) (uint16_t) (((ocf) & 0x03ff)|((ogf) << 10))
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700286#define hci_opcode_ogf(op) (op >> 10)
287#define hci_opcode_ocf(op) (op & 0x03ff)
288#define hci_recv_ctrl_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530289 (uint16_t) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700290#define hci_trans_ctrl_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530291 (uint16_t) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530292#define hci_common_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530293 (uint16_t) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530294#define hci_status_param_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530295 (uint16_t) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530296#define hci_diagnostic_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530297 (uint16_t) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700298
299/* HCI commands with no arguments*/
300#define HCI_FM_ENABLE_RECV_CMD 1
301#define HCI_FM_DISABLE_RECV_CMD 2
302#define HCI_FM_GET_RECV_CONF_CMD 3
303#define HCI_FM_GET_STATION_PARAM_CMD 4
304#define HCI_FM_GET_SIGNAL_TH_CMD 5
305#define HCI_FM_GET_PROGRAM_SERVICE_CMD 6
306#define HCI_FM_GET_RADIO_TEXT_CMD 7
307#define HCI_FM_GET_AF_LIST_CMD 8
308#define HCI_FM_CANCEL_SEARCH_CMD 9
309#define HCI_FM_RESET_CMD 10
310#define HCI_FM_GET_FEATURES_CMD 11
311#define HCI_FM_STATION_DBG_PARAM_CMD 12
312#define HCI_FM_ENABLE_TRANS_CMD 13
313#define HCI_FM_DISABLE_TRANS_CMD 14
314#define HCI_FM_GET_TX_CONFIG 15
315#define HCI_FM_GET_DET_CH_TH_CMD 16
316#define HCI_FM_GET_BLND_TBL_CMD 17
317
318/* Defines for FM TX*/
319#define TX_PS_DATA_LENGTH 108
320#define TX_RT_DATA_LENGTH 64
321#define PS_STRING_LEN 9
322
323/* ----- HCI Command request ----- */
324struct hci_fm_recv_conf_req {
325 char emphasis;
326 char ch_spacing;
327 char rds_std;
328 char hlsi;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530329 int band_low_limit;
330 int band_high_limit;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700331} ;
332
333/* ----- HCI Command request ----- */
334struct hci_fm_trans_conf_req_struct {
335 char emphasis;
336 char rds_std;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530337 int band_low_limit;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700338 int band_high_limit;
339} ;
340
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700341/* ----- HCI Command request ----- */
342struct hci_fm_tx_ps {
343 char ps_control;
344 short pi;
345 char pty;
346 char ps_repeatcount;
347 char ps_num;
348 char ps_data[TX_PS_DATA_LENGTH];
349} ;
350
351struct hci_fm_tx_rt {
352 char rt_control;
353 short pi;
354 char pty;
355 char rt_len;
356 char rt_data[TX_RT_DATA_LENGTH];
357} ;
358
359struct hci_fm_mute_mode_req {
360 char hard_mute;
361 char soft_mute;
362} ;
363
364struct hci_fm_stereo_mode_req {
365 char stereo_mode;
366 char sig_blend;
367 char intf_blend;
368 char most_switch;
369} ;
370
371struct hci_fm_search_station_req {
372 char srch_mode;
373 char scan_time;
374 char srch_dir;
375} ;
376
377struct hci_fm_search_rds_station_req {
378 struct hci_fm_search_station_req srch_station;
379 char srch_pty;
380 short srch_pi;
381} ;
382
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700383struct hci_fm_rds_grp_cntrs_params {
384 int totalRdsSBlockErrors;
385 int totalRdsGroups;
386 int totalRdsGroup0;
387 int totalRdsGroup2;
388 int totalRdsBlockB;
389 int totalRdsProcessedGroup0;
390 int totalRdsProcessedGroup2;
391 int totalRdsGroupFiltered;
392 int totalRdsChangeFiltered;
393} ;
394
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700395struct hci_fm_search_station_list_req {
396 char srch_list_mode;
397 char srch_list_dir;
398 int srch_list_max;
399 char srch_pty;
400} ;
401
402struct hci_fm_rds_grp_req {
403 int rds_grp_enable_mask;
404 int rds_buf_size;
405 char en_rds_change_filter;
406} ;
407
408struct hci_fm_en_avd_ctrl_req {
409 char no_freqs;
410 char freq_index;
411 char lo_shft;
412 short freq_min;
413 short freq_max;
414} ;
415
416struct hci_fm_def_data_rd_req {
417 char mode;
418 char length;
419 char param_len;
420 char param;
421} ;
422
423struct hci_fm_def_data_wr_req {
424 char mode;
425 char length;
426 char data[DEFAULT_DATA_SIZE];
427} ;
428
429struct hci_fm_riva_data {
430 char subopcode;
431 int start_addr;
432 char length;
433} ;
434
435struct hci_fm_riva_poke {
436 struct hci_fm_riva_data cmd_params;
437 char data[MAX_RIVA_PEEK_RSP_SIZE];
438} ;
439
440struct hci_fm_ssbi_req {
441 short start_addr;
442 char data;
443} ;
444struct hci_fm_ssbi_peek {
445 short start_address;
446} ;
447
Smriti Gupta12ee3312016-05-11 15:43:14 +0530448struct hci_fm_set_get_reset_agc {
449 char ucctrl;
450 char ucgainstate;
451} ;
452
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700453struct hci_fm_ch_det_threshold {
454 char sinr;
455 char sinr_samples;
456 char low_th;
457 char high_th;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700458} ;
459
460struct hci_fm_blend_table {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530461 char BlendType;
462 char BlendRampRateUp;
463 char BlendDebounceNumSampleUp;
464 char BlendDebounceIdxUp;
465 char BlendSinrIdxSkipStep;
466 char BlendSinrHi;
467 char BlendRmssiHi;
468 char BlendIndexHi;
469 char BlendIndex[MAX_BLEND_INDEX];
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700470} ;
471
Kamal Negi8813e0f2016-02-10 19:12:09 +0530472struct hci_fm_def_data_rd {
473 char mode;
474 char length;
475 char param_len;
476 char param;
477};
478
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700479/*HCI events*/
480#define HCI_EV_TUNE_STATUS 0x01
481#define HCI_EV_RDS_LOCK_STATUS 0x02
482#define HCI_EV_STEREO_STATUS 0x03
483#define HCI_EV_SERVICE_AVAILABLE 0x04
484#define HCI_EV_SEARCH_PROGRESS 0x05
485#define HCI_EV_SEARCH_RDS_PROGRESS 0x06
486#define HCI_EV_SEARCH_LIST_PROGRESS 0x07
487#define HCI_EV_RDS_RX_DATA 0x08
488#define HCI_EV_PROGRAM_SERVICE 0x09
489#define HCI_EV_RADIO_TEXT 0x0A
490#define HCI_EV_FM_AF_LIST 0x0B
491#define HCI_EV_TX_RDS_GRP_AVBLE 0x0C
492#define HCI_EV_TX_RDS_GRP_COMPL 0x0D
493#define HCI_EV_TX_RDS_CONT_GRP_COMPL 0x0E
494#define HCI_EV_CMD_COMPLETE 0x0F
495#define HCI_EV_CMD_STATUS 0x10
496#define HCI_EV_TUNE_COMPLETE 0x11
497#define HCI_EV_SEARCH_COMPLETE 0x12
498#define HCI_EV_SEARCH_RDS_COMPLETE 0x13
499#define HCI_EV_SEARCH_LIST_COMPLETE 0x14
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800500
501#define HCI_EV_EXT_COUNTRY_CODE 0x17
Satish kumar sugasib0ba3c82016-05-04 20:18:23 -0700502#define HCI_EV_RADIO_TEXT_PLUS_ID 0x18
503#define HCI_EV_RADIO_TEXT_PLUS_TAG 0x19
Satish kumar sugasi8a34ad32015-10-19 18:09:49 -0700504#define HCI_EV_HW_ERR_EVENT 0x1A
505
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700506#define HCI_REQ_DONE 0
507#define HCI_REQ_PEND 1
508#define HCI_REQ_CANCELED 2
509#define HCI_REQ_STATUS 3
510
511#define MAX_RAW_RDS_GRPS 21
512
513#define RDSGRP_DATA_OFFSET 0x1
514
515/*RT PLUS*/
516#define DUMMY_CLASS 0
517#define RT_PLUS_LEN_1_TAG 3
Kamal Negi8813e0f2016-02-10 19:12:09 +0530518#define RT_ERT_FLAG_BIT 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700519
520/*TAG1*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530521#define TAG1_MSB_OFFSET 3
522#define TAG1_MSB_MASK 7
523#define TAG1_LSB_OFFSET 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700524#define TAG1_POS_MSB_MASK 31
525#define TAG1_POS_MSB_OFFSET 1
526#define TAG1_POS_LSB_OFFSET 7
Kamal Negi8813e0f2016-02-10 19:12:09 +0530527#define TAG1_LEN_OFFSET 1
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700528#define TAG1_LEN_MASK 63
529
530/*TAG2*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530531#define TAG2_MSB_OFFSET 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700532#define TAG2_MSB_MASK 1
Kamal Negi8813e0f2016-02-10 19:12:09 +0530533#define TAG2_LSB_OFFSET 3
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700534#define TAG2_POS_MSB_MASK 7
535#define TAG2_POS_MSB_OFFSET 3
536#define TAG2_POS_LSB_OFFSET 5
537#define TAG2_LEN_MASK 31
538
539#define AGT_MASK 31
540/*Extract 5 left most bits of lsb of 2nd block*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530541#define AGT(x) (x & AGT_MASK)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700542/*16 bits of 4th block*/
543#define AID(lsb, msb) ((msb << 8) | (lsb))
544/*Extract 5 right most bits of msb of 2nd block*/
545#define GTC(blk2msb) (blk2msb >> 3)
546
547#define GRP_3A 0x6
548#define RT_PLUS_AID 0x4bd7
549
550/*ERT*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530551#define ERT_AID 0x6552
552#define CARRIAGE_RETURN 0x000D
553#define MAX_ERT_SEGMENT 31
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700554#define ERT_FORMAT_DIR_BIT 1
555
556#define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
557
558struct hci_ev_tune_status {
559 char sub_event;
560 int station_freq;
561 char serv_avble;
562 char rssi;
563 char stereo_prg;
564 char rds_sync_status;
565 char mute_mode;
566 char sinr;
567 char intf_det_th;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530568}__attribute__((packed)) ;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700569
570struct rds_blk_data {
571 char rdsMsb;
572 char rdsLsb;
573 char blockStatus;
574} ;
575
576struct rds_grp_data {
577 struct rds_blk_data rdsBlk[4];
578} ;
579
580struct hci_ev_rds_rx_data {
581 char num_rds_grps;
582 struct rds_grp_data rds_grp_data[MAX_RAW_RDS_GRPS];
583} ;
584
585struct hci_ev_prg_service {
586 short pi_prg_id;
587 char pty_prg_type;
588 char ta_prg_code_type;
589 char ta_ann_code_flag;
590 char ms_switch_code_flag;
591 char dec_id_ctrl_code_flag;
592 char ps_num;
593 char prg_service_name[119];
594} ;
595
596struct hci_ev_radio_text {
597 short pi_prg_id;
598 char pty_prg_type;
599 char ta_prg_code_type;
600 char txt_ab_flag;
601 char radio_txt[64];
602} ;
603
604struct hci_ev_af_list {
605 int tune_freq;
606 short pi_code;
607 char af_size;
608 char af_list[FM_AF_LIST_MAX_SIZE];
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530609} __attribute__((packed)) ;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700610
611struct hci_ev_cmd_complete {
612 char num_hci_cmd_pkts;
613 short cmd_opcode;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530614} __attribute((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700615
616struct hci_ev_cmd_status {
617 char status;
618 char num_hci_cmd_pkts;
619 short status_opcode;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530620} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700621
622struct hci_ev_srch_st {
623 int station_freq;
624 char rds_cap;
625 char pty;
626 short status_opcode;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530627} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700628
629struct hci_ev_rel_freq {
630 char rel_freq_msb;
631 char rel_freq_lsb;
632
633} ;
634struct hci_ev_srch_list_compl {
635 char num_stations_found;
636 struct hci_ev_rel_freq rel_freq[20];
637} ;
638
639/* ----- HCI Event Response ----- */
640struct hci_fm_conf_rsp {
641 char status;
642 struct hci_fm_recv_conf_req recv_conf_rsp;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530643} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700644
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700645struct hci_fm_rds_grp_cntrs_rsp {
646 char status;
647 struct hci_fm_rds_grp_cntrs_params recv_rds_grp_cntrs_rsp;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530648} __attribute__((packed));
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700649
650
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700651struct hci_fm_get_trans_conf_rsp {
652 char status;
653 struct hci_fm_trans_conf_req_struct trans_conf_rsp;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530654} __attribute__((packed));
655
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700656struct hci_fm_sig_threshold_rsp {
657 char status;
658 char sig_threshold;
659} ;
660
661struct hci_fm_station_rsp {
662 struct hci_ev_tune_status station_rsp;
663} ;
664
665struct hci_fm_prgm_srv_rsp {
666 char status;
667 struct hci_ev_prg_service prg_srv;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530668} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700669
670struct hci_fm_radio_txt_rsp {
671 char status;
672 struct hci_ev_radio_text rd_txt;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530673} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700674
675struct hci_fm_af_list_rsp {
676 char status;
677 struct hci_ev_af_list rd_txt;
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530678} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700679
680struct hci_fm_data_rd_rsp {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530681 char data_len;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700682 char data[DEFAULT_DATA_SIZE];
683} ;
684
685struct hci_fm_feature_list_rsp {
686 char status;
687 char feature_mask;
688} ;
689
690struct hci_fm_dbg_param_rsp {
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700691 char blend;
692 char soft_mute;
693 char inf_blend;
694 char inf_soft_mute;
695 char pilot_pil;
696 char io_verc;
697 char in_det_out;
698} ;
699
Kamal Negi8813e0f2016-02-10 19:12:09 +0530700#define CLKSPURID_INDEX0 0
701#define CLKSPURID_INDEX1 5
702#define CLKSPURID_INDEX2 10
703#define CLKSPURID_INDEX3 15
704#define CLKSPURID_INDEX4 20
705#define CLKSPURID_INDEX5 25
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700706
Kamal Negi8813e0f2016-02-10 19:12:09 +0530707#define MAX_SPUR_FREQ_LIMIT 30
708#define CKK_SPUR 0x3B
709#define SPUR_DATA_SIZE 0x4
710#define SPUR_ENTRIES_PER_ID 0x5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700711
712#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
713#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
714#define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
715
716struct hci_fm_spur_data {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530717 int freq[MAX_SPUR_FREQ_LIMIT];
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700718 char rmssi[MAX_SPUR_FREQ_LIMIT];
719 char enable[MAX_SPUR_FREQ_LIMIT];
Kamal Negi8a2a72a2016-06-30 11:43:32 +0530720} __attribute__((packed));
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700721
722/* HCI dev events */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530723#define RADIO_HCI_DEV_REG 1
724#define RADIO_HCI_DEV_WRITE 2
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700725
Kamal Negi8813e0f2016-02-10 19:12:09 +0530726#define hci_req_lock(d) mutex_lock(&d->req_lock)
727#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700728
729/* FM RDS */
730#define RDS_PTYPE 2
731#define RDS_PID_LOWER 1
732#define RDS_PID_HIGHER 0
733#define RDS_OFFSET 5
734#define RDS_PS_LENGTH_OFFSET 7
735#define RDS_STRING 8
736#define RDS_PS_DATA_OFFSET 8
737#define RDS_CONFIG_OFFSET 3
738#define RDS_AF_JUMP_OFFSET 4
739#define PI_CODE_OFFSET 4
740#define AF_SIZE_OFFSET 6
741#define AF_LIST_OFFSET 7
742#define RT_A_B_FLAG_OFFSET 4
743/*FM states*/
744
745enum radio_state_t {
746 FM_OFF,
747 FM_RECV,
748 FM_TRANS,
749 FM_RESET,
750 FM_CALIB,
751 FM_TURNING_OFF,
752 FM_RECV_TURNING_ON,
753 FM_TRANS_TURNING_ON,
754 FM_MAX_NO_STATES,
755};
756
757enum emphasis_type {
758 FM_RX_EMP75 = 0x0,
759 FM_RX_EMP50 = 0x1
760};
761
762enum channel_space_type {
763 FM_RX_SPACE_200KHZ = 0x0,
764 FM_RX_SPACE_100KHZ = 0x1,
765 FM_RX_SPACE_50KHZ = 0x2
766};
767
768enum high_low_injection {
769 AUTO_HI_LO_INJECTION = 0x0,
770 LOW_SIDE_INJECTION = 0x1,
771 HIGH_SIDE_INJECTION = 0x2
772};
773
774enum fm_rds_type {
775 FM_RX_RDBS_SYSTEM = 0x0,
776 FM_RX_RDS_SYSTEM = 0x1
777};
778
779enum hlm_region_t {
780 HELIUM_REGION_US,
781 HELIUM_REGION_EU,
782 HELIUM_REGION_JAPAN,
783 HELIUM_REGION_JAPAN_WIDE,
784 HELIUM_REGION_OTHER
785};
786
787/* Search options */
788enum search_t {
789 SEEK,
790 SCAN,
791 SCAN_FOR_STRONG,
792 SCAN_FOR_WEAK,
793 RDS_SEEK_PTY,
794 RDS_SCAN_PTY,
795 RDS_SEEK_PI,
796 RDS_AF_JUMP,
797};
798
799enum spur_entry_levels {
800 ENTRY_0,
801 ENTRY_1,
802 ENTRY_2,
803 ENTRY_3,
804 ENTRY_4,
805 ENTRY_5,
806};
807
808/* Band limits */
809#define REGION_US_EU_BAND_LOW 87500
810#define REGION_US_EU_BAND_HIGH 108000
811#define REGION_JAPAN_STANDARD_BAND_LOW 76000
812#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
813#define REGION_JAPAN_WIDE_BAND_LOW 90000
814#define REGION_JAPAN_WIDE_BAND_HIGH 108000
815
816#define SRCH_MODE 0x07
817#define SRCH_DIR 0x08 /* 0-up 1-down */
818#define SCAN_DWELL 0x70
Kamal Negi8813e0f2016-02-10 19:12:09 +0530819#define SRCH_ON 0x80
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700820
821/* I/O Control */
822#define IOC_HRD_MUTE 0x03
823#define IOC_SFT_MUTE 0x01
824#define IOC_MON_STR 0x01
825#define IOC_SIG_BLND 0x01
826#define IOC_INTF_BLND 0x01
827#define IOC_ANTENNA 0x01
828
829/* RDS Control */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530830#define RDS_ON 0x01
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700831#define RDS_BUF_SZ 100
832
833/* constants */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530834#define RDS_BLOCKS_NUM (4)
835#define BYTES_PER_BLOCK (3)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700836#define MAX_PS_LENGTH (108)
837#define MAX_RT_LENGTH (64)
838#define RDS_GRP_CNTR_LEN (36)
839#define RX_RT_DATA_LENGTH (63)
840/* Search direction */
841#define SRCH_DIR_UP (0)
842#define SRCH_DIR_DOWN (1)
843
844/*Search RDS stations*/
845#define SEARCH_RDS_STNS_MODE_OFFSET 4
846
847/*Search Station list */
848#define PARAMS_PER_STATION 0x08
849#define STN_NUM_OFFSET 0x01
850#define STN_FREQ_OFFSET 0x02
851#define KHZ_TO_MHZ 1000
852#define GET_MSB(x)((x >> 8) & 0xFF)
853#define GET_LSB(x)((x) & 0xFF)
854
855/* control options */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530856#define CTRL_ON (1)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700857#define CTRL_OFF (0)
858
859/*Diagnostic commands*/
860
861#define RIVA_PEEK_OPCODE 0x0D
862#define RIVA_POKE_OPCODE 0x0C
863
864#define PEEK_DATA_OFSET 0x1
865#define RIVA_PEEK_PARAM 0x6
866#define RIVA_PEEK_LEN_OFSET 0x6
867#define SSBI_PEEK_LEN 0x01
868/*Calibration data*/
869#define PROCS_CALIB_MODE 1
870#define PROCS_CALIB_SIZE 23
871#define DC_CALIB_MODE 2
872#define DC_CALIB_SIZE 48
873#define RSB_CALIB_MODE 3
874#define RSB_CALIB_SIZE 4
875#define CALIB_DATA_OFSET 2
876#define CALIB_MODE_OFSET 1
877#define MAX_CALIB_SIZE 75
878
879/* Channel validity */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530880#define INVALID_CHANNEL (0)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700881#define VALID_CHANNEL (1)
882
883struct hci_fm_set_cal_req_proc {
884 char mode;
885 /*Max process calibration data size*/
886 char data[PROCS_CALIB_SIZE];
887} ;
888
889struct hci_fm_set_cal_req_dc {
890 char mode;
891 /*Max DC calibration data size*/
892 char data[DC_CALIB_SIZE];
893} ;
894
895struct hci_cc_do_calibration_rsp {
896 char status;
897 char mode;
898 char data[MAX_CALIB_SIZE];
899} ;
900
901struct hci_fm_set_spur_table_req {
902 char mode;
903 char no_of_freqs_entries;
904 char spur_data[FM_SPUR_TBL_SIZE];
905} ;
906/* Low Power mode*/
907#define SIG_LEVEL_INTR (1 << 0)
908#define RDS_SYNC_INTR (1 << 1)
909#define AUDIO_CTRL_INTR (1 << 2)
910#define AF_JUMP_ENABLE (1 << 4)
911
912int hci_def_data_read(struct hci_fm_def_data_rd_req *arg,
913 struct radio_hci_dev *hdev);
914int hci_def_data_write(struct hci_fm_def_data_wr_req *arg,
915 struct radio_hci_dev *hdev);
916int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700917
918static inline int is_valid_tone(int tone)
919{
920 if ((tone >= MIN_TX_TONE_VAL) &&
921 (tone <= MAX_TX_TONE_VAL))
922 return 1;
923 else
924 return 0;
925}
926
927static inline int is_valid_hard_mute(int hard_mute)
928{
929 if ((hard_mute >= MIN_HARD_MUTE_VAL) &&
930 (hard_mute <= MAX_HARD_MUTE_VAL))
931 return 1;
932 else
933 return 0;
934}
935
936static inline int is_valid_srch_mode(int srch_mode)
937{
938 if ((srch_mode >= MIN_SRCH_MODE) &&
939 (srch_mode <= MAX_SRCH_MODE))
940 return 1;
941 else
942 return 0;
943}
944
945static inline int is_valid_scan_dwell_prd(int scan_dwell_prd)
946{
947 if ((scan_dwell_prd >= MIN_SCAN_DWELL) &&
948 (scan_dwell_prd <= MAX_SCAN_DWELL))
949 return 1;
950 else
951 return 0;
952}
953
954static inline int is_valid_sig_th(int sig_th)
955{
956 if ((sig_th >= MIN_SIG_TH) &&
957 (sig_th <= MAX_SIG_TH))
958 return 1;
959 else
960 return 0;
961}
962
963static inline int is_valid_pty(int pty)
964{
965 if ((pty >= MIN_PTY) &&
966 (pty <= MAX_PTY))
967 return 1;
968 else
969 return 0;
970}
971
972static inline int is_valid_pi(int pi)
973{
974 if ((pi >= MIN_PI) &&
975 (pi <= MAX_PI))
976 return 1;
977 else
978 return 0;
979}
980
981static inline int is_valid_srch_station_cnt(int cnt)
982{
983 if ((cnt >= MIN_SRCH_STATIONS_CNT) &&
984 (cnt <= MAX_SRCH_STATIONS_CNT))
985 return 1;
986 else
987 return 0;
988}
989
990static inline int is_valid_chan_spacing(int spacing)
991{
992 if ((spacing >= MIN_CHAN_SPACING) &&
993 (spacing <= MAX_CHAN_SPACING))
994 return 1;
995 else
996 return 0;
997}
998
999static inline int is_valid_emphasis(int emphasis)
1000{
1001 if ((emphasis >= MIN_EMPHASIS) &&
1002 (emphasis <= MAX_EMPHASIS))
1003 return 1;
1004 else
1005 return 0;
1006}
1007
1008static inline int is_valid_rds_std(int rds_std)
1009{
1010 if ((rds_std >= MIN_RDS_STD) &&
1011 (rds_std <= MAX_RDS_STD))
1012 return 1;
1013 else
1014 return 0;
1015}
1016
1017static inline int is_valid_antenna(int antenna_type)
1018{
1019 if ((antenna_type >= MIN_ANTENNA_VAL) &&
1020 (antenna_type <= MAX_ANTENNA_VAL))
1021 return 1;
1022 else
1023 return 0;
1024}
1025
1026static inline int is_valid_ps_repeat_cnt(int cnt)
1027{
1028 if ((cnt >= MIN_TX_PS_REPEAT_CNT) &&
1029 (cnt <= MAX_TX_PS_REPEAT_CNT))
1030 return 1;
1031 else
1032 return 0;
1033}
1034
1035static inline int is_valid_soft_mute(int soft_mute)
1036{
1037 if ((soft_mute >= MIN_SOFT_MUTE) &&
1038 (soft_mute <= MAX_SOFT_MUTE))
1039 return 1;
1040 else
1041 return 0;
1042}
1043
1044static inline int is_valid_peek_len(int len)
1045{
1046 if ((len >= MIN_PEEK_ACCESS_LEN) &&
1047 (len <= MAX_PEEK_ACCESS_LEN))
1048 return 1;
1049 else
1050 return 0;
1051}
1052
1053static inline int is_valid_reset_cntr(int cntr)
1054{
1055 if ((cntr >= MIN_RESET_CNTR) &&
1056 (cntr <= MAX_RESET_CNTR))
1057 return 1;
1058 else
1059 return 0;
1060}
1061
1062static inline int is_valid_hlsi(int hlsi)
1063{
1064 if ((hlsi >= MIN_HLSI) &&
1065 (hlsi <= MAX_HLSI))
1066 return 1;
1067 else
1068 return 0;
1069}
1070
1071static inline int is_valid_notch_filter(int filter)
1072{
1073 if ((filter >= MIN_NOTCH_FILTER) &&
1074 (filter <= MAX_NOTCH_FILTER))
1075 return 1;
1076 else
1077 return 0;
1078}
1079
1080static inline int is_valid_intf_det_low_th(int th)
1081{
1082 if ((th >= MIN_INTF_DET_OUT_LW_TH) &&
1083 (th <= MAX_INTF_DET_OUT_LW_TH))
1084 return 1;
1085 else
1086 return 0;
1087}
1088
1089static inline int is_valid_intf_det_hgh_th(int th)
1090{
1091 if ((th >= MIN_INTF_DET_OUT_HG_TH) &&
1092 (th <= MAX_INTF_DET_OUT_HG_TH))
1093 return 1;
1094 else
1095 return 0;
1096}
1097
1098static inline int is_valid_sinr_th(int th)
1099{
1100 if ((th >= MIN_SINR_TH) &&
1101 (th <= MAX_SINR_TH))
1102 return 1;
1103 else
1104 return 0;
1105}
1106
1107static inline int is_valid_sinr_samples(int samples_cnt)
1108{
1109 if ((samples_cnt >= MIN_SINR_SAMPLES) &&
1110 (samples_cnt <= MAX_SINR_SAMPLES))
1111 return 1;
1112 else
1113 return 0;
1114}
1115
1116static inline int is_valid_fm_state(int state)
1117{
1118 if ((state >= 0) && (state < FM_MAX_NO_STATES))
1119 return 1;
1120 else
1121 return 0;
1122}
1123
1124static inline int is_valid_blend_value(int val)
1125{
1126 if ((val >= MIN_BLEND_HI) && (val <= MAX_BLEND_HI))
1127 return 1;
1128 else
1129 return 0;
1130}
1131
Kamal Negi8a2a72a2016-06-30 11:43:32 +05301132struct radio_helium_device {
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001133 int tune_req;
1134 unsigned int mode;
1135 short pi;
1136 char pty;
1137 char ps_repeatcount;
1138 char prev_trans_rds;
1139 char af_jump_bit;
1140 struct hci_fm_mute_mode_req mute_mode;
1141 struct hci_fm_stereo_mode_req stereo_mode;
1142 struct hci_fm_station_rsp fm_st_rsp;
1143 struct hci_fm_search_station_req srch_st;
1144 struct hci_fm_search_rds_station_req srch_rds;
1145 struct hci_fm_search_station_list_req srch_st_list;
1146 struct hci_fm_recv_conf_req recv_conf;
1147 struct hci_fm_trans_conf_req_struct trans_conf;
1148 struct hci_fm_rds_grp_req rds_grp;
1149 unsigned char g_search_mode;
1150 unsigned char power_mode;
1151 int search_on;
1152 unsigned char spur_table_size;
1153 unsigned char g_scan_time;
1154 unsigned int g_antenna;
1155 unsigned int g_rds_grp_proc_ps;
1156 unsigned char event_mask;
1157 enum hlm_region_t region;
1158 struct hci_fm_dbg_param_rsp st_dbg_param;
1159 struct hci_ev_srch_list_compl srch_st_result;
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001160 struct hci_fm_riva_poke riva_data_req;
1161 struct hci_fm_ssbi_req ssbi_data_accs;
1162 struct hci_fm_ssbi_peek ssbi_peek_reg;
Smriti Gupta12ee3312016-05-11 15:43:14 +05301163 struct hci_fm_set_get_reset_agc set_get_reset_agc;
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001164 struct hci_fm_ch_det_threshold ch_det_threshold;
Kamal Negi8813e0f2016-02-10 19:12:09 +05301165 struct hci_fm_data_rd_rsp def_data;
1166 struct hci_fm_blend_table blend_tbl;
Kamal Negi8a2a72a2016-06-30 11:43:32 +05301167} __attribute__((packed));
Kamal Negi8813e0f2016-02-10 19:12:09 +05301168
1169#define set_bit(flag, bit_pos) ((flag) |= (1 << (bit_pos)))
1170#define clear_bit(flag, bit_pos) ((flag) &= (~(1 << (bit_pos))))
1171#define test_bit(flag, bit_pos) ((flag) & (1 << (bit_pos)))
1172#define clear_all_bit(flag) ((flag) &= (~0xFFFFFFFF))
1173#define CMD_CHDET_SINR_TH (1)
1174#define CMD_CHDET_SINR_SAMPLE (2)
1175#define CMD_CHDET_INTF_TH_LOW (3)
1176#define CMD_CHDET_INTF_TH_HIGH (4)
1177
1178#define CMD_DEFRD_AF_RMSSI_TH (1)
1179#define CMD_DEFRD_AF_RMSSI_SAMPLE (2)
1180#define CMD_DEFRD_GD_CH_RMSSI_TH (3)
1181#define CMD_DEFRD_SEARCH_ALGO (4)
1182#define CMD_DEFRD_SINR_FIRST_STAGE (5)
1183#define CMD_DEFRD_RMSSI_FIRST_STAGE (6)
1184#define CMD_DEFRD_CF0TH12 (7)
1185#define CMD_DEFRD_TUNE_POWER (8)
1186#define CMD_DEFRD_REPEATCOUNT (9)
1187
1188#define CMD_STNPARAM_RSSI (1)
1189#define CMD_STNPARAM_SINR (2)
1190#define CMD_STNPARAM_INTF_DET_TH (3)
1191
1192#define CMD_STNDBGPARAM_BLEND (1)
1193#define CMD_STNDBGPARAM_SOFTMUTE (2)
1194#define CMD_STNDBGPARAM_INFBLEND (3)
1195#define CMD_STNDBGPARAM_INFSOFTMUTE (4)
1196#define CMD_STNDBGPARAM_PILOTPLL (5)
1197#define CMD_STNDBGPARAM_IOVERC (6)
1198#define CMD_STNDBGPARAM_INFDETOUT (7)
1199
1200#define CMD_BLENDTBL_SINR_HI (1)
1201#define CMD_BLENDTBL_RMSSI_HI (2)
1202
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001203int hci_fm_disable_recv_req();
1204int helium_search_list(struct hci_fm_search_station_list_req *s_list);
1205int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch);
1206int helium_search_stations(struct hci_fm_search_station_req *srch);
1207int helium_cancel_search_req();
1208int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf);
1209int hci_fm_get_program_service_req ();
1210int hci_fm_get_rds_grpcounters_req (int val);
Satish kumar sugasi649b9902016-04-28 17:55:29 -07001211int hci_fm_get_rds_grpcounters_ext_req (int val);
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001212int hci_fm_set_notch_filter_req (int val);
1213int helium_set_sig_threshold_req(char th);
1214int helium_rds_grp_mask_req(struct hci_fm_rds_grp_req *rds_grp_msk);
1215int helium_rds_grp_process_req(int rds_grp);
1216int helium_set_event_mask_req(char e_mask);
1217int helium_set_antenna_req(char ant);
1218int helium_set_fm_mute_mode_req(struct hci_fm_mute_mode_req *mute);
1219int hci_fm_tune_station_req(int param);
1220int hci_set_fm_stereo_mode_req(struct hci_fm_stereo_mode_req *param);
1221int hci_peek_data(struct hci_fm_riva_data *data);
1222int hci_poke_data(struct hci_fm_riva_poke *data);
1223int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data);
1224int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data);
Smriti Gupta12ee3312016-05-11 15:43:14 +05301225int hci_get_set_reset_agc_req(struct hci_fm_set_get_reset_agc *data);
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001226int hci_fm_get_ch_det_th();
1227int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th);
Kamal Negi8813e0f2016-02-10 19:12:09 +05301228int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd);
1229int hci_fm_get_blend_req();
1230int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl);
Kiran Kelagericad71712016-04-27 16:54:22 -07001231int hci_fm_enable_lpf(int enable);
Kamal Negi8813e0f2016-02-10 19:12:09 +05301232int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt);
1233int hci_fm_get_station_dbg_param_req();
1234int hci_fm_get_station_cmd_param_req();
Kamal Negice09c302016-12-29 16:45:38 +05301235int hci_fm_enable_slimbus(uint8_t enable);
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001236
Kamal Negi8a2a72a2016-06-30 11:43:32 +05301237struct fm_hal_t {
1238 struct radio_helium_device *radio;
1239 fm_hal_callbacks_t *jni_cb;
1240 void *private_data;
1241};
1242
1243struct fm_interface_t {
1244 int (*init)(const fm_hal_callbacks_t *p_cb);
1245 int (*set_fm_ctrl)(int opcode, int val);
Kamal Negi31bed2c2016-10-06 10:47:19 +05301246 void (*get_fm_ctrl) (int opcode, int *val);
Kamal Negi8a2a72a2016-06-30 11:43:32 +05301247};
1248
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001249#endif /* __UAPI_RADIO_HCI_CORE_H */
Kamal Negi8a2a72a2016-06-30 11:43:32 +05301250