blob: cb72cd557f13ec767f3ea97a20ea710f130afdc1 [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
Satish kumar sugasibf9558e2016-05-10 14:30:17 -0700143#define ECC_EVENT_BUFSIZE 12
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700144typedef enum {
145 ASSOCIATE_JVM,
146 DISASSOCIATE_JVM
147} bt_cb_thread_evt;
148
149#define TUNE_PARAM 16
150#define SIZE_ARRAY(x) (sizeof(x) / sizeof((x)[0]))
151typedef void (*enb_result_cb)();
152typedef void (*tune_rsp_cb)(int Freq);
153typedef void (*seek_rsp_cb)(int Freq);
154typedef void (*scan_rsp_cb)();
155typedef void (*srch_list_rsp_cb)(uint16_t *scan_tbl);
156typedef void (*stereo_mode_cb)(bool status);
157typedef void (*rds_avl_sts_cb)(bool status);
158typedef void (*af_list_cb)(uint16_t *af_list);
159typedef void (*rt_cb)(char *rt);
160typedef void (*ps_cb)(char *ps);
161typedef void (*oda_cb)();
162typedef void (*rt_plus_cb)(char *rt_plus);
163typedef void (*ert_cb)(char *ert);
164typedef void (*disable_cb)();
165typedef void (*callback_thread_event)(unsigned int evt);
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700166typedef void (*rds_grp_cntrs_cb)(char *rds_params);
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800167typedef void (*fm_peek_cb)(char *peek_rsp);
168typedef void (*fm_ssbi_peek_cb)(char *ssbi_peek_rsp);
Smriti Gupta12ee3312016-05-11 15:43:14 +0530169typedef void (*fm_agc_gain_cb)(char *agc_gain_rsp);
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800170typedef void (*fm_ch_det_th_cb)(char *ch_det_rsp);
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800171typedef void (*fm_ecc_evt_cb)(char *ecc_rsp);
Kamal Negi8813e0f2016-02-10 19:12:09 +0530172typedef void (*fm_sig_thr_cb) (int val, int status);
173typedef void (*fm_get_ch_det_thrs_cb) (int val, int status);
174typedef void (*fm_def_data_rd_cb) (int val, int status);
175typedef void (*fm_get_blnd_cb) (int val, int status);
176typedef void (*fm_set_ch_det_thrs_cb) (int status);
177typedef void (*fm_def_data_wrt_cb) (int status);
178typedef void (*fm_set_blnd_cb) (int status);
179typedef void (*fm_get_stn_prm_cb) (int val, int status);
180typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700181
182typedef struct {
183 size_t size;
184
185 enb_result_cb enabled_cb;
186 tune_rsp_cb tune_cb;
187 seek_rsp_cb seek_cmpl_cb;
188 scan_rsp_cb scan_next_cb;
189 srch_list_rsp_cb srch_list_cb;
190 stereo_mode_cb stereo_status_cb;
191 rds_avl_sts_cb rds_avail_status_cb;
192 af_list_cb af_list_update_cb;
193 rt_cb rt_update_cb;
194 ps_cb ps_update_cb;
195 oda_cb oda_update_cb;
196 rt_plus_cb rt_plus_update_cb;
197 ert_cb ert_update_cb;
198 disable_cb disabled_cb;
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700199 rds_grp_cntrs_cb rds_grp_cntrs_rsp_cb;
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800200 fm_peek_cb fm_peek_rsp_cb;
201 fm_ssbi_peek_cb fm_ssbi_peek_rsp_cb;
Smriti Gupta12ee3312016-05-11 15:43:14 +0530202 fm_agc_gain_cb fm_agc_gain_rsp_cb;
Satish kumar sugasi88832b92015-12-21 18:52:29 -0800203 fm_ch_det_th_cb fm_ch_det_th_rsp_cb;
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800204 fm_ecc_evt_cb ext_country_code_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700205 callback_thread_event thread_evt_cb;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530206 fm_sig_thr_cb fm_get_sig_thres_cb;
207 fm_get_ch_det_thrs_cb fm_get_ch_det_thr_cb;
208 fm_def_data_rd_cb fm_def_data_read_cb;
209 fm_get_blnd_cb fm_get_blend_cb;
210 fm_set_ch_det_thrs_cb fm_set_ch_det_thr_cb;
211 fm_def_data_wrt_cb fm_def_data_write_cb;
212 fm_set_blnd_cb fm_set_blend_cb;
213 fm_get_stn_prm_cb fm_get_station_param_cb;
214 fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700215} fm_vendor_callbacks_t;
216
217pthread_mutex_t radio_fm_cmd;
218typedef struct {
219 int (*init)(const fm_vendor_callbacks_t *p_cb);
220 int (*set_fm_ctrl)(int opcode, int val);
221 void (*Get_fm_ctrl) (int opcode, int val);
222} fm_interface_t;
223
224typedef int (*fm_evt_notify_cb)(unsigned char *p_buf);
225
226typedef struct {
227 fm_evt_notify_cb fm_evt_notify;
228} fm_hal_cb;
229
230struct radio_hci_command_hdr {
231 short opcode; /* OCF & OGF */
232 char plen;
233} ;
234
235struct radio_hci_event_hdr {
236 char evt;
237 char plen;
238} ;
239
240struct radio_hci_dev {
241 char name[8];
242 unsigned long flags;
243 short id;
244 char bus;
245 char dev_type;
246 char dev_name[248];
247 char dev_class[3];
248 char features[8];
249 char commands[64];
250 unsigned int data_block_len;
251 unsigned long cmd_last_tx;
252 int req_status;
253 int req_result;
254};
255
256/* Opcode OCF */
257/* HCI recv control commands opcode */
258#define HCI_OCF_FM_ENABLE_RECV_REQ 0x0001
259#define HCI_OCF_FM_DISABLE_RECV_REQ 0x0002
260#define HCI_OCF_FM_GET_RECV_CONF_REQ 0x0003
261#define HCI_OCF_FM_SET_RECV_CONF_REQ 0x0004
262#define HCI_OCF_FM_SET_MUTE_MODE_REQ 0x0005
263#define HCI_OCF_FM_SET_STEREO_MODE_REQ 0x0006
264#define HCI_OCF_FM_SET_ANTENNA 0x0007
265#define HCI_OCF_FM_SET_SIGNAL_THRESHOLD 0x0008
266#define HCI_OCF_FM_GET_SIGNAL_THRESHOLD 0x0009
267#define HCI_OCF_FM_GET_STATION_PARAM_REQ 0x000A
268#define HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ 0x000B
269#define HCI_OCF_FM_GET_RADIO_TEXT_REQ 0x000C
270#define HCI_OCF_FM_GET_AF_LIST_REQ 0x000D
271#define HCI_OCF_FM_SEARCH_STATIONS 0x000E
272#define HCI_OCF_FM_SEARCH_RDS_STATIONS 0x000F
273#define HCI_OCF_FM_SEARCH_STATIONS_LIST 0x0010
274#define HCI_OCF_FM_CANCEL_SEARCH 0x0011
275#define HCI_OCF_FM_RDS_GRP 0x0012
276#define HCI_OCF_FM_RDS_GRP_PROCESS 0x0013
277#define HCI_OCF_FM_EN_WAN_AVD_CTRL 0x0014
278#define HCI_OCF_FM_EN_NOTCH_CTRL 0x0015
279#define HCI_OCF_FM_SET_EVENT_MASK 0x0016
280#define HCI_OCF_FM_SET_CH_DET_THRESHOLD 0x0017
281#define HCI_OCF_FM_GET_CH_DET_THRESHOLD 0x0018
282#define HCI_OCF_FM_SET_BLND_TBL 0x001B
283#define HCI_OCF_FM_GET_BLND_TBL 0x001C
284/* HCI trans control commans opcode*/
285#define HCI_OCF_FM_ENABLE_TRANS_REQ 0x0001
286#define HCI_OCF_FM_DISABLE_TRANS_REQ 0x0002
287#define HCI_OCF_FM_GET_TRANS_CONF_REQ 0x0003
288#define HCI_OCF_FM_SET_TRANS_CONF_REQ 0x0004
289#define HCI_OCF_FM_RDS_RT_REQ 0x0008
290#define HCI_OCF_FM_RDS_PS_REQ 0x0009
291
292
293/* HCI common control commands opcode */
294#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
295#define HCI_OCF_FM_DEFAULT_DATA_READ 0x0002
296#define HCI_OCF_FM_DEFAULT_DATA_WRITE 0x0003
297#define HCI_OCF_FM_RESET 0x0004
298#define HCI_OCF_FM_GET_FEATURE_LIST 0x0005
299#define HCI_OCF_FM_DO_CALIBRATION 0x0006
300#define HCI_OCF_FM_SET_CALIBRATION 0x0007
301#define HCI_OCF_FM_SET_SPUR_TABLE 0x0008
302#define HCI_OCF_FM_GET_SPUR_TABLE 0x0009
303
304/*HCI Status parameters commands*/
305#define HCI_OCF_FM_READ_GRP_COUNTERS 0x0001
306
307/*HCI Diagnostic commands*/
308#define HCI_OCF_FM_PEEK_DATA 0x0002
309#define HCI_OCF_FM_POKE_DATA 0x0003
310#define HCI_OCF_FM_SSBI_PEEK_REG 0x0004
311#define HCI_OCF_FM_SSBI_POKE_REG 0x0005
312#define HCI_OCF_FM_STATION_DBG_PARAM 0x0007
313#define HCI_FM_SET_INTERNAL_TONE_GENRATOR 0x0008
Smriti Gupta12ee3312016-05-11 15:43:14 +0530314#define HCI_FM_SET_GET_RESET_AGC 0x000D
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700315
316/* Opcode OGF */
317#define HCI_OGF_FM_RECV_CTRL_CMD_REQ 0x0013
318#define HCI_OGF_FM_TRANS_CTRL_CMD_REQ 0x0014
319#define HCI_OGF_FM_COMMON_CTRL_CMD_REQ 0x0015
320#define HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ 0x0016
321#define HCI_OGF_FM_TEST_CMD_REQ 0x0017
322#define HCI_OGF_FM_DIAGNOSTIC_CMD_REQ 0x003F
323
324/* Command opcode pack/unpack */
Smriti Gupta12ee3312016-05-11 15:43:14 +0530325#define hci_opcode_pack(ogf, ocf) (uint16_t) (((ocf) & 0x03ff)|((ogf) << 10))
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700326#define hci_opcode_ogf(op) (op >> 10)
327#define hci_opcode_ocf(op) (op & 0x03ff)
328#define hci_recv_ctrl_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530329 (uint16_t) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700330#define hci_trans_ctrl_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530331 (uint16_t) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530332#define hci_common_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530333 (uint16_t) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530334#define hci_status_param_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530335 (uint16_t) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
Kamal Negi8813e0f2016-02-10 19:12:09 +0530336#define hci_diagnostic_cmd_op_pack(ocf) \
Smriti Gupta12ee3312016-05-11 15:43:14 +0530337 (uint16_t) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700338
339/* HCI commands with no arguments*/
340#define HCI_FM_ENABLE_RECV_CMD 1
341#define HCI_FM_DISABLE_RECV_CMD 2
342#define HCI_FM_GET_RECV_CONF_CMD 3
343#define HCI_FM_GET_STATION_PARAM_CMD 4
344#define HCI_FM_GET_SIGNAL_TH_CMD 5
345#define HCI_FM_GET_PROGRAM_SERVICE_CMD 6
346#define HCI_FM_GET_RADIO_TEXT_CMD 7
347#define HCI_FM_GET_AF_LIST_CMD 8
348#define HCI_FM_CANCEL_SEARCH_CMD 9
349#define HCI_FM_RESET_CMD 10
350#define HCI_FM_GET_FEATURES_CMD 11
351#define HCI_FM_STATION_DBG_PARAM_CMD 12
352#define HCI_FM_ENABLE_TRANS_CMD 13
353#define HCI_FM_DISABLE_TRANS_CMD 14
354#define HCI_FM_GET_TX_CONFIG 15
355#define HCI_FM_GET_DET_CH_TH_CMD 16
356#define HCI_FM_GET_BLND_TBL_CMD 17
357
358/* Defines for FM TX*/
359#define TX_PS_DATA_LENGTH 108
360#define TX_RT_DATA_LENGTH 64
361#define PS_STRING_LEN 9
362
363/* ----- HCI Command request ----- */
364struct hci_fm_recv_conf_req {
365 char emphasis;
366 char ch_spacing;
367 char rds_std;
368 char hlsi;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530369 int band_low_limit;
370 int band_high_limit;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700371} ;
372
373/* ----- HCI Command request ----- */
374struct hci_fm_trans_conf_req_struct {
375 char emphasis;
376 char rds_std;
Kamal Negi8813e0f2016-02-10 19:12:09 +0530377 int band_low_limit;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700378 int band_high_limit;
379} ;
380
381
382/* ----- HCI Command request ----- */
383struct hci_fm_tx_ps {
384 char ps_control;
385 short pi;
386 char pty;
387 char ps_repeatcount;
388 char ps_num;
389 char ps_data[TX_PS_DATA_LENGTH];
390} ;
391
392struct hci_fm_tx_rt {
393 char rt_control;
394 short pi;
395 char pty;
396 char rt_len;
397 char rt_data[TX_RT_DATA_LENGTH];
398} ;
399
400struct hci_fm_mute_mode_req {
401 char hard_mute;
402 char soft_mute;
403} ;
404
405struct hci_fm_stereo_mode_req {
406 char stereo_mode;
407 char sig_blend;
408 char intf_blend;
409 char most_switch;
410} ;
411
412struct hci_fm_search_station_req {
413 char srch_mode;
414 char scan_time;
415 char srch_dir;
416} ;
417
418struct hci_fm_search_rds_station_req {
419 struct hci_fm_search_station_req srch_station;
420 char srch_pty;
421 short srch_pi;
422} ;
423
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700424struct hci_fm_rds_grp_cntrs_params {
425 int totalRdsSBlockErrors;
426 int totalRdsGroups;
427 int totalRdsGroup0;
428 int totalRdsGroup2;
429 int totalRdsBlockB;
430 int totalRdsProcessedGroup0;
431 int totalRdsProcessedGroup2;
432 int totalRdsGroupFiltered;
433 int totalRdsChangeFiltered;
434} ;
435
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700436struct hci_fm_search_station_list_req {
437 char srch_list_mode;
438 char srch_list_dir;
439 int srch_list_max;
440 char srch_pty;
441} ;
442
443struct hci_fm_rds_grp_req {
444 int rds_grp_enable_mask;
445 int rds_buf_size;
446 char en_rds_change_filter;
447} ;
448
449struct hci_fm_en_avd_ctrl_req {
450 char no_freqs;
451 char freq_index;
452 char lo_shft;
453 short freq_min;
454 short freq_max;
455} ;
456
457struct hci_fm_def_data_rd_req {
458 char mode;
459 char length;
460 char param_len;
461 char param;
462} ;
463
464struct hci_fm_def_data_wr_req {
465 char mode;
466 char length;
467 char data[DEFAULT_DATA_SIZE];
468} ;
469
470struct hci_fm_riva_data {
471 char subopcode;
472 int start_addr;
473 char length;
474} ;
475
476struct hci_fm_riva_poke {
477 struct hci_fm_riva_data cmd_params;
478 char data[MAX_RIVA_PEEK_RSP_SIZE];
479} ;
480
481struct hci_fm_ssbi_req {
482 short start_addr;
483 char data;
484} ;
485struct hci_fm_ssbi_peek {
486 short start_address;
487} ;
488
Smriti Gupta12ee3312016-05-11 15:43:14 +0530489struct hci_fm_set_get_reset_agc {
490 char ucctrl;
491 char ucgainstate;
492} ;
493
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700494struct hci_fm_ch_det_threshold {
495 char sinr;
496 char sinr_samples;
497 char low_th;
498 char high_th;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700499} ;
500
501struct hci_fm_blend_table {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530502 char BlendType;
503 char BlendRampRateUp;
504 char BlendDebounceNumSampleUp;
505 char BlendDebounceIdxUp;
506 char BlendSinrIdxSkipStep;
507 char BlendSinrHi;
508 char BlendRmssiHi;
509 char BlendIndexHi;
510 char BlendIndex[MAX_BLEND_INDEX];
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700511} ;
512
Kamal Negi8813e0f2016-02-10 19:12:09 +0530513struct hci_fm_def_data_rd {
514 char mode;
515 char length;
516 char param_len;
517 char param;
518};
519
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700520/*HCI events*/
521#define HCI_EV_TUNE_STATUS 0x01
522#define HCI_EV_RDS_LOCK_STATUS 0x02
523#define HCI_EV_STEREO_STATUS 0x03
524#define HCI_EV_SERVICE_AVAILABLE 0x04
525#define HCI_EV_SEARCH_PROGRESS 0x05
526#define HCI_EV_SEARCH_RDS_PROGRESS 0x06
527#define HCI_EV_SEARCH_LIST_PROGRESS 0x07
528#define HCI_EV_RDS_RX_DATA 0x08
529#define HCI_EV_PROGRAM_SERVICE 0x09
530#define HCI_EV_RADIO_TEXT 0x0A
531#define HCI_EV_FM_AF_LIST 0x0B
532#define HCI_EV_TX_RDS_GRP_AVBLE 0x0C
533#define HCI_EV_TX_RDS_GRP_COMPL 0x0D
534#define HCI_EV_TX_RDS_CONT_GRP_COMPL 0x0E
535#define HCI_EV_CMD_COMPLETE 0x0F
536#define HCI_EV_CMD_STATUS 0x10
537#define HCI_EV_TUNE_COMPLETE 0x11
538#define HCI_EV_SEARCH_COMPLETE 0x12
539#define HCI_EV_SEARCH_RDS_COMPLETE 0x13
540#define HCI_EV_SEARCH_LIST_COMPLETE 0x14
Satish kumar sugasid8731b72016-01-27 14:45:45 -0800541
542#define HCI_EV_EXT_COUNTRY_CODE 0x17
Satish kumar sugasib0ba3c82016-05-04 20:18:23 -0700543#define HCI_EV_RADIO_TEXT_PLUS_ID 0x18
544#define HCI_EV_RADIO_TEXT_PLUS_TAG 0x19
Satish kumar sugasi8a34ad32015-10-19 18:09:49 -0700545#define HCI_EV_HW_ERR_EVENT 0x1A
546
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700547#define HCI_REQ_DONE 0
548#define HCI_REQ_PEND 1
549#define HCI_REQ_CANCELED 2
550#define HCI_REQ_STATUS 3
551
552#define MAX_RAW_RDS_GRPS 21
553
554#define RDSGRP_DATA_OFFSET 0x1
555
556/*RT PLUS*/
557#define DUMMY_CLASS 0
558#define RT_PLUS_LEN_1_TAG 3
Kamal Negi8813e0f2016-02-10 19:12:09 +0530559#define RT_ERT_FLAG_BIT 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700560
561/*TAG1*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530562#define TAG1_MSB_OFFSET 3
563#define TAG1_MSB_MASK 7
564#define TAG1_LSB_OFFSET 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700565#define TAG1_POS_MSB_MASK 31
566#define TAG1_POS_MSB_OFFSET 1
567#define TAG1_POS_LSB_OFFSET 7
Kamal Negi8813e0f2016-02-10 19:12:09 +0530568#define TAG1_LEN_OFFSET 1
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700569#define TAG1_LEN_MASK 63
570
571/*TAG2*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530572#define TAG2_MSB_OFFSET 5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700573#define TAG2_MSB_MASK 1
Kamal Negi8813e0f2016-02-10 19:12:09 +0530574#define TAG2_LSB_OFFSET 3
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700575#define TAG2_POS_MSB_MASK 7
576#define TAG2_POS_MSB_OFFSET 3
577#define TAG2_POS_LSB_OFFSET 5
578#define TAG2_LEN_MASK 31
579
580#define AGT_MASK 31
581/*Extract 5 left most bits of lsb of 2nd block*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530582#define AGT(x) (x & AGT_MASK)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700583/*16 bits of 4th block*/
584#define AID(lsb, msb) ((msb << 8) | (lsb))
585/*Extract 5 right most bits of msb of 2nd block*/
586#define GTC(blk2msb) (blk2msb >> 3)
587
588#define GRP_3A 0x6
589#define RT_PLUS_AID 0x4bd7
590
591/*ERT*/
Kamal Negi8813e0f2016-02-10 19:12:09 +0530592#define ERT_AID 0x6552
593#define CARRIAGE_RETURN 0x000D
594#define MAX_ERT_SEGMENT 31
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700595#define ERT_FORMAT_DIR_BIT 1
596
597#define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
598
599struct hci_ev_tune_status {
600 char sub_event;
601 int station_freq;
602 char serv_avble;
603 char rssi;
604 char stereo_prg;
605 char rds_sync_status;
606 char mute_mode;
607 char sinr;
608 char intf_det_th;
609} ;
610
611struct rds_blk_data {
612 char rdsMsb;
613 char rdsLsb;
614 char blockStatus;
615} ;
616
617struct rds_grp_data {
618 struct rds_blk_data rdsBlk[4];
619} ;
620
621struct hci_ev_rds_rx_data {
622 char num_rds_grps;
623 struct rds_grp_data rds_grp_data[MAX_RAW_RDS_GRPS];
624} ;
625
626struct hci_ev_prg_service {
627 short pi_prg_id;
628 char pty_prg_type;
629 char ta_prg_code_type;
630 char ta_ann_code_flag;
631 char ms_switch_code_flag;
632 char dec_id_ctrl_code_flag;
633 char ps_num;
634 char prg_service_name[119];
635} ;
636
637struct hci_ev_radio_text {
638 short pi_prg_id;
639 char pty_prg_type;
640 char ta_prg_code_type;
641 char txt_ab_flag;
642 char radio_txt[64];
643} ;
644
645struct hci_ev_af_list {
646 int tune_freq;
647 short pi_code;
648 char af_size;
649 char af_list[FM_AF_LIST_MAX_SIZE];
650} ;
651
652struct hci_ev_cmd_complete {
653 char num_hci_cmd_pkts;
654 short cmd_opcode;
655} ;
656
657struct hci_ev_cmd_status {
658 char status;
659 char num_hci_cmd_pkts;
660 short status_opcode;
661} ;
662
663struct hci_ev_srch_st {
664 int station_freq;
665 char rds_cap;
666 char pty;
667 short status_opcode;
668} ;
669
670struct hci_ev_rel_freq {
671 char rel_freq_msb;
672 char rel_freq_lsb;
673
674} ;
675struct hci_ev_srch_list_compl {
676 char num_stations_found;
677 struct hci_ev_rel_freq rel_freq[20];
678} ;
679
680/* ----- HCI Event Response ----- */
681struct hci_fm_conf_rsp {
682 char status;
683 struct hci_fm_recv_conf_req recv_conf_rsp;
684} ;
685
Satish kumar sugasi84e51de2015-09-30 18:27:43 -0700686struct hci_fm_rds_grp_cntrs_rsp {
687 char status;
688 struct hci_fm_rds_grp_cntrs_params recv_rds_grp_cntrs_rsp;
689} ;
690
691
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700692struct hci_fm_get_trans_conf_rsp {
693 char status;
694 struct hci_fm_trans_conf_req_struct trans_conf_rsp;
695} ;
696struct hci_fm_sig_threshold_rsp {
697 char status;
698 char sig_threshold;
699} ;
700
701struct hci_fm_station_rsp {
702 struct hci_ev_tune_status station_rsp;
703} ;
704
705struct hci_fm_prgm_srv_rsp {
706 char status;
707 struct hci_ev_prg_service prg_srv;
708} ;
709
710struct hci_fm_radio_txt_rsp {
711 char status;
712 struct hci_ev_radio_text rd_txt;
713} ;
714
715struct hci_fm_af_list_rsp {
716 char status;
717 struct hci_ev_af_list rd_txt;
718} ;
719
720struct hci_fm_data_rd_rsp {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530721 char data_len;
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700722 char data[DEFAULT_DATA_SIZE];
723} ;
724
725struct hci_fm_feature_list_rsp {
726 char status;
727 char feature_mask;
728} ;
729
730struct hci_fm_dbg_param_rsp {
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700731 char blend;
732 char soft_mute;
733 char inf_blend;
734 char inf_soft_mute;
735 char pilot_pil;
736 char io_verc;
737 char in_det_out;
738} ;
739
Kamal Negi8813e0f2016-02-10 19:12:09 +0530740#define CLKSPURID_INDEX0 0
741#define CLKSPURID_INDEX1 5
742#define CLKSPURID_INDEX2 10
743#define CLKSPURID_INDEX3 15
744#define CLKSPURID_INDEX4 20
745#define CLKSPURID_INDEX5 25
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700746
Kamal Negi8813e0f2016-02-10 19:12:09 +0530747#define MAX_SPUR_FREQ_LIMIT 30
748#define CKK_SPUR 0x3B
749#define SPUR_DATA_SIZE 0x4
750#define SPUR_ENTRIES_PER_ID 0x5
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700751
752#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
753#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
754#define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
755
756struct hci_fm_spur_data {
Kamal Negi8813e0f2016-02-10 19:12:09 +0530757 int freq[MAX_SPUR_FREQ_LIMIT];
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700758 char rmssi[MAX_SPUR_FREQ_LIMIT];
759 char enable[MAX_SPUR_FREQ_LIMIT];
760} ;
761
762
763/* HCI dev events */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530764#define RADIO_HCI_DEV_REG 1
765#define RADIO_HCI_DEV_WRITE 2
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700766
Kamal Negi8813e0f2016-02-10 19:12:09 +0530767#define hci_req_lock(d) mutex_lock(&d->req_lock)
768#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700769
770/* FM RDS */
771#define RDS_PTYPE 2
772#define RDS_PID_LOWER 1
773#define RDS_PID_HIGHER 0
774#define RDS_OFFSET 5
775#define RDS_PS_LENGTH_OFFSET 7
776#define RDS_STRING 8
777#define RDS_PS_DATA_OFFSET 8
778#define RDS_CONFIG_OFFSET 3
779#define RDS_AF_JUMP_OFFSET 4
780#define PI_CODE_OFFSET 4
781#define AF_SIZE_OFFSET 6
782#define AF_LIST_OFFSET 7
783#define RT_A_B_FLAG_OFFSET 4
784/*FM states*/
785
786enum radio_state_t {
787 FM_OFF,
788 FM_RECV,
789 FM_TRANS,
790 FM_RESET,
791 FM_CALIB,
792 FM_TURNING_OFF,
793 FM_RECV_TURNING_ON,
794 FM_TRANS_TURNING_ON,
795 FM_MAX_NO_STATES,
796};
797
798enum emphasis_type {
799 FM_RX_EMP75 = 0x0,
800 FM_RX_EMP50 = 0x1
801};
802
803enum channel_space_type {
804 FM_RX_SPACE_200KHZ = 0x0,
805 FM_RX_SPACE_100KHZ = 0x1,
806 FM_RX_SPACE_50KHZ = 0x2
807};
808
809enum high_low_injection {
810 AUTO_HI_LO_INJECTION = 0x0,
811 LOW_SIDE_INJECTION = 0x1,
812 HIGH_SIDE_INJECTION = 0x2
813};
814
815enum fm_rds_type {
816 FM_RX_RDBS_SYSTEM = 0x0,
817 FM_RX_RDS_SYSTEM = 0x1
818};
819
820enum hlm_region_t {
821 HELIUM_REGION_US,
822 HELIUM_REGION_EU,
823 HELIUM_REGION_JAPAN,
824 HELIUM_REGION_JAPAN_WIDE,
825 HELIUM_REGION_OTHER
826};
827
828/* Search options */
829enum search_t {
830 SEEK,
831 SCAN,
832 SCAN_FOR_STRONG,
833 SCAN_FOR_WEAK,
834 RDS_SEEK_PTY,
835 RDS_SCAN_PTY,
836 RDS_SEEK_PI,
837 RDS_AF_JUMP,
838};
839
840enum spur_entry_levels {
841 ENTRY_0,
842 ENTRY_1,
843 ENTRY_2,
844 ENTRY_3,
845 ENTRY_4,
846 ENTRY_5,
847};
848
849/* Band limits */
850#define REGION_US_EU_BAND_LOW 87500
851#define REGION_US_EU_BAND_HIGH 108000
852#define REGION_JAPAN_STANDARD_BAND_LOW 76000
853#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
854#define REGION_JAPAN_WIDE_BAND_LOW 90000
855#define REGION_JAPAN_WIDE_BAND_HIGH 108000
856
857#define SRCH_MODE 0x07
858#define SRCH_DIR 0x08 /* 0-up 1-down */
859#define SCAN_DWELL 0x70
Kamal Negi8813e0f2016-02-10 19:12:09 +0530860#define SRCH_ON 0x80
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700861
862/* I/O Control */
863#define IOC_HRD_MUTE 0x03
864#define IOC_SFT_MUTE 0x01
865#define IOC_MON_STR 0x01
866#define IOC_SIG_BLND 0x01
867#define IOC_INTF_BLND 0x01
868#define IOC_ANTENNA 0x01
869
870/* RDS Control */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530871#define RDS_ON 0x01
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700872#define RDS_BUF_SZ 100
873
874/* constants */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530875#define RDS_BLOCKS_NUM (4)
876#define BYTES_PER_BLOCK (3)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700877#define MAX_PS_LENGTH (108)
878#define MAX_RT_LENGTH (64)
879#define RDS_GRP_CNTR_LEN (36)
880#define RX_RT_DATA_LENGTH (63)
881/* Search direction */
882#define SRCH_DIR_UP (0)
883#define SRCH_DIR_DOWN (1)
884
885/*Search RDS stations*/
886#define SEARCH_RDS_STNS_MODE_OFFSET 4
887
888/*Search Station list */
889#define PARAMS_PER_STATION 0x08
890#define STN_NUM_OFFSET 0x01
891#define STN_FREQ_OFFSET 0x02
892#define KHZ_TO_MHZ 1000
893#define GET_MSB(x)((x >> 8) & 0xFF)
894#define GET_LSB(x)((x) & 0xFF)
895
896/* control options */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530897#define CTRL_ON (1)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700898#define CTRL_OFF (0)
899
900/*Diagnostic commands*/
901
902#define RIVA_PEEK_OPCODE 0x0D
903#define RIVA_POKE_OPCODE 0x0C
904
905#define PEEK_DATA_OFSET 0x1
906#define RIVA_PEEK_PARAM 0x6
907#define RIVA_PEEK_LEN_OFSET 0x6
908#define SSBI_PEEK_LEN 0x01
909/*Calibration data*/
910#define PROCS_CALIB_MODE 1
911#define PROCS_CALIB_SIZE 23
912#define DC_CALIB_MODE 2
913#define DC_CALIB_SIZE 48
914#define RSB_CALIB_MODE 3
915#define RSB_CALIB_SIZE 4
916#define CALIB_DATA_OFSET 2
917#define CALIB_MODE_OFSET 1
918#define MAX_CALIB_SIZE 75
919
920/* Channel validity */
Kamal Negi8813e0f2016-02-10 19:12:09 +0530921#define INVALID_CHANNEL (0)
Satish kumar sugasi644b4882016-05-04 20:15:31 -0700922#define VALID_CHANNEL (1)
923
924struct hci_fm_set_cal_req_proc {
925 char mode;
926 /*Max process calibration data size*/
927 char data[PROCS_CALIB_SIZE];
928} ;
929
930struct hci_fm_set_cal_req_dc {
931 char mode;
932 /*Max DC calibration data size*/
933 char data[DC_CALIB_SIZE];
934} ;
935
936struct hci_cc_do_calibration_rsp {
937 char status;
938 char mode;
939 char data[MAX_CALIB_SIZE];
940} ;
941
942struct hci_fm_set_spur_table_req {
943 char mode;
944 char no_of_freqs_entries;
945 char spur_data[FM_SPUR_TBL_SIZE];
946} ;
947/* Low Power mode*/
948#define SIG_LEVEL_INTR (1 << 0)
949#define RDS_SYNC_INTR (1 << 1)
950#define AUDIO_CTRL_INTR (1 << 2)
951#define AF_JUMP_ENABLE (1 << 4)
952
953int hci_def_data_read(struct hci_fm_def_data_rd_req *arg,
954 struct radio_hci_dev *hdev);
955int hci_def_data_write(struct hci_fm_def_data_wr_req *arg,
956 struct radio_hci_dev *hdev);
957int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
958int hci_fm_do_calibration(char *arg, struct radio_hci_dev *hdev);
959
960static inline int is_valid_tone(int tone)
961{
962 if ((tone >= MIN_TX_TONE_VAL) &&
963 (tone <= MAX_TX_TONE_VAL))
964 return 1;
965 else
966 return 0;
967}
968
969static inline int is_valid_hard_mute(int hard_mute)
970{
971 if ((hard_mute >= MIN_HARD_MUTE_VAL) &&
972 (hard_mute <= MAX_HARD_MUTE_VAL))
973 return 1;
974 else
975 return 0;
976}
977
978static inline int is_valid_srch_mode(int srch_mode)
979{
980 if ((srch_mode >= MIN_SRCH_MODE) &&
981 (srch_mode <= MAX_SRCH_MODE))
982 return 1;
983 else
984 return 0;
985}
986
987static inline int is_valid_scan_dwell_prd(int scan_dwell_prd)
988{
989 if ((scan_dwell_prd >= MIN_SCAN_DWELL) &&
990 (scan_dwell_prd <= MAX_SCAN_DWELL))
991 return 1;
992 else
993 return 0;
994}
995
996static inline int is_valid_sig_th(int sig_th)
997{
998 if ((sig_th >= MIN_SIG_TH) &&
999 (sig_th <= MAX_SIG_TH))
1000 return 1;
1001 else
1002 return 0;
1003}
1004
1005static inline int is_valid_pty(int pty)
1006{
1007 if ((pty >= MIN_PTY) &&
1008 (pty <= MAX_PTY))
1009 return 1;
1010 else
1011 return 0;
1012}
1013
1014static inline int is_valid_pi(int pi)
1015{
1016 if ((pi >= MIN_PI) &&
1017 (pi <= MAX_PI))
1018 return 1;
1019 else
1020 return 0;
1021}
1022
1023static inline int is_valid_srch_station_cnt(int cnt)
1024{
1025 if ((cnt >= MIN_SRCH_STATIONS_CNT) &&
1026 (cnt <= MAX_SRCH_STATIONS_CNT))
1027 return 1;
1028 else
1029 return 0;
1030}
1031
1032static inline int is_valid_chan_spacing(int spacing)
1033{
1034 if ((spacing >= MIN_CHAN_SPACING) &&
1035 (spacing <= MAX_CHAN_SPACING))
1036 return 1;
1037 else
1038 return 0;
1039}
1040
1041static inline int is_valid_emphasis(int emphasis)
1042{
1043 if ((emphasis >= MIN_EMPHASIS) &&
1044 (emphasis <= MAX_EMPHASIS))
1045 return 1;
1046 else
1047 return 0;
1048}
1049
1050static inline int is_valid_rds_std(int rds_std)
1051{
1052 if ((rds_std >= MIN_RDS_STD) &&
1053 (rds_std <= MAX_RDS_STD))
1054 return 1;
1055 else
1056 return 0;
1057}
1058
1059static inline int is_valid_antenna(int antenna_type)
1060{
1061 if ((antenna_type >= MIN_ANTENNA_VAL) &&
1062 (antenna_type <= MAX_ANTENNA_VAL))
1063 return 1;
1064 else
1065 return 0;
1066}
1067
1068static inline int is_valid_ps_repeat_cnt(int cnt)
1069{
1070 if ((cnt >= MIN_TX_PS_REPEAT_CNT) &&
1071 (cnt <= MAX_TX_PS_REPEAT_CNT))
1072 return 1;
1073 else
1074 return 0;
1075}
1076
1077static inline int is_valid_soft_mute(int soft_mute)
1078{
1079 if ((soft_mute >= MIN_SOFT_MUTE) &&
1080 (soft_mute <= MAX_SOFT_MUTE))
1081 return 1;
1082 else
1083 return 0;
1084}
1085
1086static inline int is_valid_peek_len(int len)
1087{
1088 if ((len >= MIN_PEEK_ACCESS_LEN) &&
1089 (len <= MAX_PEEK_ACCESS_LEN))
1090 return 1;
1091 else
1092 return 0;
1093}
1094
1095static inline int is_valid_reset_cntr(int cntr)
1096{
1097 if ((cntr >= MIN_RESET_CNTR) &&
1098 (cntr <= MAX_RESET_CNTR))
1099 return 1;
1100 else
1101 return 0;
1102}
1103
1104static inline int is_valid_hlsi(int hlsi)
1105{
1106 if ((hlsi >= MIN_HLSI) &&
1107 (hlsi <= MAX_HLSI))
1108 return 1;
1109 else
1110 return 0;
1111}
1112
1113static inline int is_valid_notch_filter(int filter)
1114{
1115 if ((filter >= MIN_NOTCH_FILTER) &&
1116 (filter <= MAX_NOTCH_FILTER))
1117 return 1;
1118 else
1119 return 0;
1120}
1121
1122static inline int is_valid_intf_det_low_th(int th)
1123{
1124 if ((th >= MIN_INTF_DET_OUT_LW_TH) &&
1125 (th <= MAX_INTF_DET_OUT_LW_TH))
1126 return 1;
1127 else
1128 return 0;
1129}
1130
1131static inline int is_valid_intf_det_hgh_th(int th)
1132{
1133 if ((th >= MIN_INTF_DET_OUT_HG_TH) &&
1134 (th <= MAX_INTF_DET_OUT_HG_TH))
1135 return 1;
1136 else
1137 return 0;
1138}
1139
1140static inline int is_valid_sinr_th(int th)
1141{
1142 if ((th >= MIN_SINR_TH) &&
1143 (th <= MAX_SINR_TH))
1144 return 1;
1145 else
1146 return 0;
1147}
1148
1149static inline int is_valid_sinr_samples(int samples_cnt)
1150{
1151 if ((samples_cnt >= MIN_SINR_SAMPLES) &&
1152 (samples_cnt <= MAX_SINR_SAMPLES))
1153 return 1;
1154 else
1155 return 0;
1156}
1157
1158static inline int is_valid_fm_state(int state)
1159{
1160 if ((state >= 0) && (state < FM_MAX_NO_STATES))
1161 return 1;
1162 else
1163 return 0;
1164}
1165
1166static inline int is_valid_blend_value(int val)
1167{
1168 if ((val >= MIN_BLEND_HI) && (val <= MAX_BLEND_HI))
1169 return 1;
1170 else
1171 return 0;
1172}
1173
1174struct helium_device {
1175 int tune_req;
1176 unsigned int mode;
1177 short pi;
1178 char pty;
1179 char ps_repeatcount;
1180 char prev_trans_rds;
1181 char af_jump_bit;
1182 struct hci_fm_mute_mode_req mute_mode;
1183 struct hci_fm_stereo_mode_req stereo_mode;
1184 struct hci_fm_station_rsp fm_st_rsp;
1185 struct hci_fm_search_station_req srch_st;
1186 struct hci_fm_search_rds_station_req srch_rds;
1187 struct hci_fm_search_station_list_req srch_st_list;
1188 struct hci_fm_recv_conf_req recv_conf;
1189 struct hci_fm_trans_conf_req_struct trans_conf;
1190 struct hci_fm_rds_grp_req rds_grp;
1191 unsigned char g_search_mode;
1192 unsigned char power_mode;
1193 int search_on;
1194 unsigned char spur_table_size;
1195 unsigned char g_scan_time;
1196 unsigned int g_antenna;
1197 unsigned int g_rds_grp_proc_ps;
1198 unsigned char event_mask;
1199 enum hlm_region_t region;
1200 struct hci_fm_dbg_param_rsp st_dbg_param;
1201 struct hci_ev_srch_list_compl srch_st_result;
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001202 struct hci_fm_riva_poke riva_data_req;
1203 struct hci_fm_ssbi_req ssbi_data_accs;
1204 struct hci_fm_ssbi_peek ssbi_peek_reg;
Smriti Gupta12ee3312016-05-11 15:43:14 +05301205 struct hci_fm_set_get_reset_agc set_get_reset_agc;
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001206 struct hci_fm_ch_det_threshold ch_det_threshold;
Kamal Negi8813e0f2016-02-10 19:12:09 +05301207 struct hci_fm_data_rd_rsp def_data;
1208 struct hci_fm_blend_table blend_tbl;
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001209};
Kamal Negi8813e0f2016-02-10 19:12:09 +05301210
1211#define set_bit(flag, bit_pos) ((flag) |= (1 << (bit_pos)))
1212#define clear_bit(flag, bit_pos) ((flag) &= (~(1 << (bit_pos))))
1213#define test_bit(flag, bit_pos) ((flag) & (1 << (bit_pos)))
1214#define clear_all_bit(flag) ((flag) &= (~0xFFFFFFFF))
1215#define CMD_CHDET_SINR_TH (1)
1216#define CMD_CHDET_SINR_SAMPLE (2)
1217#define CMD_CHDET_INTF_TH_LOW (3)
1218#define CMD_CHDET_INTF_TH_HIGH (4)
1219
1220#define CMD_DEFRD_AF_RMSSI_TH (1)
1221#define CMD_DEFRD_AF_RMSSI_SAMPLE (2)
1222#define CMD_DEFRD_GD_CH_RMSSI_TH (3)
1223#define CMD_DEFRD_SEARCH_ALGO (4)
1224#define CMD_DEFRD_SINR_FIRST_STAGE (5)
1225#define CMD_DEFRD_RMSSI_FIRST_STAGE (6)
1226#define CMD_DEFRD_CF0TH12 (7)
1227#define CMD_DEFRD_TUNE_POWER (8)
1228#define CMD_DEFRD_REPEATCOUNT (9)
1229
1230#define CMD_STNPARAM_RSSI (1)
1231#define CMD_STNPARAM_SINR (2)
1232#define CMD_STNPARAM_INTF_DET_TH (3)
1233
1234#define CMD_STNDBGPARAM_BLEND (1)
1235#define CMD_STNDBGPARAM_SOFTMUTE (2)
1236#define CMD_STNDBGPARAM_INFBLEND (3)
1237#define CMD_STNDBGPARAM_INFSOFTMUTE (4)
1238#define CMD_STNDBGPARAM_PILOTPLL (5)
1239#define CMD_STNDBGPARAM_IOVERC (6)
1240#define CMD_STNDBGPARAM_INFDETOUT (7)
1241
1242#define CMD_BLENDTBL_SINR_HI (1)
1243#define CMD_BLENDTBL_RMSSI_HI (2)
1244
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001245int hci_fm_disable_recv_req();
1246int helium_search_list(struct hci_fm_search_station_list_req *s_list);
1247int helium_search_rds_stations(struct hci_fm_search_rds_station_req *rds_srch);
1248int helium_search_stations(struct hci_fm_search_station_req *srch);
1249int helium_cancel_search_req();
1250int hci_fm_set_recv_conf_req (struct hci_fm_recv_conf_req *conf);
1251int hci_fm_get_program_service_req ();
1252int hci_fm_get_rds_grpcounters_req (int val);
1253int hci_fm_set_notch_filter_req (int val);
1254int helium_set_sig_threshold_req(char th);
1255int helium_rds_grp_mask_req(struct hci_fm_rds_grp_req *rds_grp_msk);
1256int helium_rds_grp_process_req(int rds_grp);
1257int helium_set_event_mask_req(char e_mask);
1258int helium_set_antenna_req(char ant);
1259int helium_set_fm_mute_mode_req(struct hci_fm_mute_mode_req *mute);
1260int hci_fm_tune_station_req(int param);
1261int hci_set_fm_stereo_mode_req(struct hci_fm_stereo_mode_req *param);
1262int hci_peek_data(struct hci_fm_riva_data *data);
1263int hci_poke_data(struct hci_fm_riva_poke *data);
1264int hci_ssbi_poke_reg(struct hci_fm_ssbi_req *data);
1265int hci_ssbi_peek_reg(struct hci_fm_ssbi_peek *data);
Smriti Gupta12ee3312016-05-11 15:43:14 +05301266int hci_get_set_reset_agc_req(struct hci_fm_set_get_reset_agc *data);
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001267int hci_fm_get_ch_det_th();
1268int set_ch_det_thresholds_req(struct hci_fm_ch_det_threshold *ch_det_th);
Kamal Negi8813e0f2016-02-10 19:12:09 +05301269int hci_fm_default_data_read_req(struct hci_fm_def_data_rd_req *def_data_rd);
1270int hci_fm_get_blend_req();
1271int hci_fm_set_blend_tbl_req(struct hci_fm_blend_table *blnd_tbl);
1272int hci_fm_default_data_write_req(struct hci_fm_def_data_wr_req * data_wrt);
1273int hci_fm_get_station_dbg_param_req();
1274int hci_fm_get_station_cmd_param_req();
Satish kumar sugasi88832b92015-12-21 18:52:29 -08001275
Satish kumar sugasi644b4882016-05-04 20:15:31 -07001276#endif /* __UAPI_RADIO_HCI_CORE_H */