blob: 4cbac7bd0040874fde708d66cd3a1328cfe8e1e5 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/*
2 *
Venkateshwarlu Domakondaac31b782013-04-05 15:12:32 +05303 * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004 *
5 * This file is based on include/net/bluetooth/hci_core.h
6 *
7 * Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation;
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
14 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
16 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
17 * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 *
22 * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
23 * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
24 * SOFTWARE IS DISCLAIMED.
25 */
26
27#ifndef __RADIO_HCI_CORE_H
28#define __RADIO_HCI_CORE_H
29
30#include <linux/skbuff.h>
31#include <linux/interrupt.h>
32#include <linux/mutex.h>
33#include <linux/atomic.h>
Venkateshwarlu Domakondaac31b782013-04-05 15:12:32 +053034#include "radio-iris-commands.h"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070035
36/* ---- HCI Packet structures ---- */
37#define RADIO_HCI_COMMAND_HDR_SIZE sizeof(struct radio_hci_command_hdr)
38#define RADIO_HCI_EVENT_HDR_SIZE sizeof(struct radio_hci_event_hdr)
39
40/* HCI data types */
41#define RADIO_HCI_COMMAND_PKT 0x11
42#define RADIO_HCI_EVENT_PKT 0x14
Srinivasa Rao Uppalaabc8efa2011-08-02 14:31:30 -070043/*HCI reponce packets*/
44#define MAX_RIVA_PEEK_RSP_SIZE 251
Venkateshwarlu Domakonda787af692011-10-14 21:23:03 +053045/* default data access */
46#define DEFAULT_DATA_OFFSET 2
47#define DEFAULT_DATA_SIZE 249
Venkateshwarlu Domakonda71731d52012-04-04 12:30:51 +053048/* Power levels are 0-7, but SOC will expect values from 0-255
49 * So the each level step size will be 255/7 = 36 */
50#define FM_TX_PWR_LVL_STEP_SIZE 36
51#define FM_TX_PWR_LVL_0 0 /* Lowest power lvl that can be set for Tx */
52#define FM_TX_PWR_LVL_MAX 7 /* Max power lvl for Tx */
53#define FM_TX_PHY_CFG_MODE 0x3c
54#define FM_TX_PHY_CFG_LEN 0x10
55#define FM_TX_PWR_GAIN_OFFSET 14
Ayaz Ahmaddb04b0c2013-02-01 17:18:34 +053056/**RDS CONFIG MODE**/
57#define FM_RDS_CNFG_MODE 0x0f
58#define FM_RDS_CNFG_LEN 0x10
59#define AF_RMSSI_TH_LSB_OFFSET 10
60#define AF_RMSSI_TH_MSB_OFFSET 11
61#define AF_RMSSI_SAMPLES_OFFSET 15
62/**RX CONFIG MODE**/
63#define FM_RX_CONFG_MODE 0x15
64#define FM_RX_CNFG_LEN 0x20
65#define GD_CH_RMSSI_TH_OFFSET 12
66#define MAX_GD_CH_RMSSI_TH 127
67#define SRCH_ALGO_TYPE_OFFSET 25
68#define SINRFIRSTSTAGE_OFFSET 26
69#define RMSSIFIRSTSTAGE_OFFSET 27
70#define CF0TH12_BYTE1_OFFSET 8
71#define CF0TH12_BYTE2_OFFSET 9
72#define CF0TH12_BYTE3_OFFSET 10
73#define CF0TH12_BYTE4_OFFSET 11
74#define MAX_SINR_FIRSTSTAGE 127
75#define MAX_RMSSI_FIRSTSTAGE 127
Venkateshwarlu Domakonda70e47162013-04-30 14:12:13 +053076#define RDS_PS0_XFR_MODE 0x01
77#define RDS_PS0_LEN 6
78#define RX_REPEATE_BYTE_OFFSET 5
Ayaz Ahmaddb04b0c2013-02-01 17:18:34 +053079
Venkateshwarlu Domakondae8a4187c2013-06-25 18:56:54 +053080#define FM_AF_LIST_MAX_SIZE 200
81#define AF_LIST_MAX (FM_AF_LIST_MAX_SIZE / 4) /* Each AF frequency consist
82 of sizeof(int) bytes */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070083/* HCI timeouts */
84#define RADIO_HCI_TIMEOUT (10000) /* 10 seconds */
85
86#define TUNE_PARAM 16
87struct radio_hci_command_hdr {
88 __le16 opcode; /* OCF & OGF */
89 __u8 plen;
90} __packed;
91
92struct radio_hci_event_hdr {
93 __u8 evt;
94 __u8 plen;
95} __packed;
96
97struct radio_hci_dev {
98 char name[8];
99 unsigned long flags;
100 __u16 id;
101 __u8 bus;
102 __u8 dev_type;
103 __u8 dev_name[248];
104 __u8 dev_class[3];
105 __u8 features[8];
106 __u8 commands[64];
107
108 unsigned int data_block_len;
109 unsigned long cmd_last_tx;
110
111 struct sk_buff *sent_cmd;
112
113 __u32 req_status;
114 __u32 req_result;
115 atomic_t cmd_cnt;
116
117 struct tasklet_struct cmd_task;
118 struct tasklet_struct rx_task;
119 struct tasklet_struct tx_task;
120
121 struct sk_buff_head rx_q;
122 struct sk_buff_head raw_q;
123 struct sk_buff_head cmd_q;
124
125 struct mutex req_lock;
126 wait_queue_head_t req_wait_q;
127
128 int (*open)(struct radio_hci_dev *hdev);
129 int (*close)(struct radio_hci_dev *hdev);
130 int (*flush)(struct radio_hci_dev *hdev);
131 int (*send)(struct sk_buff *skb);
132 void (*destruct)(struct radio_hci_dev *hdev);
133 void (*notify)(struct radio_hci_dev *hdev, unsigned int evt);
134};
135
136int radio_hci_register_dev(struct radio_hci_dev *hdev);
137int radio_hci_unregister_dev(struct radio_hci_dev *hdev);
138int radio_hci_recv_frame(struct sk_buff *skb);
139int radio_hci_send_cmd(struct radio_hci_dev *hdev, __u16 opcode, __u32 plen,
140 void *param);
141void radio_hci_event_packet(struct radio_hci_dev *hdev, struct sk_buff *skb);
142
143/* Opcode OCF */
144/* HCI recv control commands opcode */
145#define HCI_OCF_FM_ENABLE_RECV_REQ 0x0001
146#define HCI_OCF_FM_DISABLE_RECV_REQ 0x0002
147#define HCI_OCF_FM_GET_RECV_CONF_REQ 0x0003
148#define HCI_OCF_FM_SET_RECV_CONF_REQ 0x0004
149#define HCI_OCF_FM_SET_MUTE_MODE_REQ 0x0005
150#define HCI_OCF_FM_SET_STEREO_MODE_REQ 0x0006
151#define HCI_OCF_FM_SET_ANTENNA 0x0007
152#define HCI_OCF_FM_SET_SIGNAL_THRESHOLD 0x0008
153#define HCI_OCF_FM_GET_SIGNAL_THRESHOLD 0x0009
154#define HCI_OCF_FM_GET_STATION_PARAM_REQ 0x000A
155#define HCI_OCF_FM_GET_PROGRAM_SERVICE_REQ 0x000B
156#define HCI_OCF_FM_GET_RADIO_TEXT_REQ 0x000C
157#define HCI_OCF_FM_GET_AF_LIST_REQ 0x000D
158#define HCI_OCF_FM_SEARCH_STATIONS 0x000E
159#define HCI_OCF_FM_SEARCH_RDS_STATIONS 0x000F
160#define HCI_OCF_FM_SEARCH_STATIONS_LIST 0x0010
161#define HCI_OCF_FM_CANCEL_SEARCH 0x0011
162#define HCI_OCF_FM_RDS_GRP 0x0012
163#define HCI_OCF_FM_RDS_GRP_PROCESS 0x0013
164#define HCI_OCF_FM_EN_WAN_AVD_CTRL 0x0014
165#define HCI_OCF_FM_EN_NOTCH_CTRL 0x0015
Srinivasa Rao Uppalaf856ae62011-10-17 18:43:26 +0530166#define HCI_OCF_FM_SET_EVENT_MASK 0x0016
Srinivasa Rao Uppalad3184a42012-01-04 21:18:01 +0530167#define HCI_OCF_FM_SET_CH_DET_THRESHOLD 0x0017
168#define HCI_OCF_FM_GET_CH_DET_THRESHOLD 0x0018
Ankur Nandwanid928d542011-08-11 13:15:41 -0700169/* HCI trans control commans opcode*/
170#define HCI_OCF_FM_ENABLE_TRANS_REQ 0x0001
171#define HCI_OCF_FM_DISABLE_TRANS_REQ 0x0002
172#define HCI_OCF_FM_GET_TRANS_CONF_REQ 0x0003
173#define HCI_OCF_FM_SET_TRANS_CONF_REQ 0x0004
174#define HCI_OCF_FM_RDS_RT_REQ 0x0008
175#define HCI_OCF_FM_RDS_PS_REQ 0x0009
176
177
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700178/* HCI common control commands opcode */
179#define HCI_OCF_FM_TUNE_STATION_REQ 0x0001
180#define HCI_OCF_FM_DEFAULT_DATA_READ 0x0002
181#define HCI_OCF_FM_DEFAULT_DATA_WRITE 0x0003
182#define HCI_OCF_FM_RESET 0x0004
183#define HCI_OCF_FM_GET_FEATURE_LIST 0x0005
184#define HCI_OCF_FM_DO_CALIBRATION 0x0006
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530185#define HCI_OCF_FM_SET_CALIBRATION 0x0007
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700186
187/*HCI Status parameters commands*/
188#define HCI_OCF_FM_READ_GRP_COUNTERS 0x0001
189
190/*HCI Diagnostic commands*/
191#define HCI_OCF_FM_PEEK_DATA 0x0002
192#define HCI_OCF_FM_POKE_DATA 0x0003
193#define HCI_OCF_FM_SSBI_PEEK_REG 0x0004
194#define HCI_OCF_FM_SSBI_POKE_REG 0x0005
195#define HCI_OCF_FM_STATION_DBG_PARAM 0x0007
Ankur Nandwanid928d542011-08-11 13:15:41 -0700196#define HCI_FM_SET_INTERNAL_TONE_GENRATOR 0x0008
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700197
198/* Opcode OGF */
199#define HCI_OGF_FM_RECV_CTRL_CMD_REQ 0x0013
Ankur Nandwanid928d542011-08-11 13:15:41 -0700200#define HCI_OGF_FM_TRANS_CTRL_CMD_REQ 0x0014
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700201#define HCI_OGF_FM_COMMON_CTRL_CMD_REQ 0x0015
202#define HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ 0x0016
203#define HCI_OGF_FM_TEST_CMD_REQ 0x0017
204#define HCI_OGF_FM_DIAGNOSTIC_CMD_REQ 0x003F
205
206/* Command opcode pack/unpack */
207#define hci_opcode_pack(ogf, ocf) (__u16) ((ocf & 0x03ff)|(ogf << 10))
208#define hci_opcode_ogf(op) (op >> 10)
209#define hci_opcode_ocf(op) (op & 0x03ff)
210#define hci_recv_ctrl_cmd_op_pack(ocf) \
211 (__u16) hci_opcode_pack(HCI_OGF_FM_RECV_CTRL_CMD_REQ, ocf)
Ankur Nandwanid928d542011-08-11 13:15:41 -0700212#define hci_trans_ctrl_cmd_op_pack(ocf) \
213 (__u16) hci_opcode_pack(HCI_OGF_FM_TRANS_CTRL_CMD_REQ, ocf)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700214#define hci_common_cmd_op_pack(ocf) \
215 (__u16) hci_opcode_pack(HCI_OGF_FM_COMMON_CTRL_CMD_REQ, ocf)
216#define hci_status_param_op_pack(ocf) \
217 (__u16) hci_opcode_pack(HCI_OGF_FM_STATUS_PARAMETERS_CMD_REQ, ocf)
218#define hci_diagnostic_cmd_op_pack(ocf) \
219 (__u16) hci_opcode_pack(HCI_OGF_FM_DIAGNOSTIC_CMD_REQ, ocf)
220
221
222/* HCI commands with no arguments*/
223#define HCI_FM_ENABLE_RECV_CMD 1
224#define HCI_FM_DISABLE_RECV_CMD 2
225#define HCI_FM_GET_RECV_CONF_CMD 3
226#define HCI_FM_GET_STATION_PARAM_CMD 4
227#define HCI_FM_GET_SIGNAL_TH_CMD 5
228#define HCI_FM_GET_PROGRAM_SERVICE_CMD 6
229#define HCI_FM_GET_RADIO_TEXT_CMD 7
230#define HCI_FM_GET_AF_LIST_CMD 8
231#define HCI_FM_CANCEL_SEARCH_CMD 9
232#define HCI_FM_RESET_CMD 10
233#define HCI_FM_GET_FEATURES_CMD 11
234#define HCI_FM_STATION_DBG_PARAM_CMD 12
Ankur Nandwanid928d542011-08-11 13:15:41 -0700235#define HCI_FM_ENABLE_TRANS_CMD 13
236#define HCI_FM_DISABLE_TRANS_CMD 14
Srinivasa Rao Uppalac5320c22011-11-28 14:28:51 +0530237#define HCI_FM_GET_TX_CONFIG 15
Srinivasa Rao Uppalad3184a42012-01-04 21:18:01 +0530238#define HCI_FM_GET_DET_CH_TH_CMD 16
Ankur Nandwanid928d542011-08-11 13:15:41 -0700239
240/* Defines for FM TX*/
Ayaz Ahmad1c0db522012-08-27 17:52:51 +0530241#define TX_PS_DATA_LENGTH 108
Ankur Nandwanid928d542011-08-11 13:15:41 -0700242#define TX_RT_DATA_LENGTH 64
Ayaz Ahmad1c0db522012-08-27 17:52:51 +0530243#define PS_STRING_LEN 9
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700244
245/* ----- HCI Command request ----- */
246struct hci_fm_recv_conf_req {
247 __u8 emphasis;
248 __u8 ch_spacing;
249 __u8 rds_std;
250 __u8 hlsi;
251 __u32 band_low_limit;
252 __u32 band_high_limit;
253} __packed;
254
Ankur Nandwanid928d542011-08-11 13:15:41 -0700255/* ----- HCI Command request ----- */
256struct hci_fm_trans_conf_req_struct {
257 __u8 emphasis;
258 __u8 rds_std;
259 __u32 band_low_limit;
260 __u32 band_high_limit;
261} __packed;
262
263
264/* ----- HCI Command request ----- */
265struct hci_fm_tx_ps {
266 __u8 ps_control;
267 __u16 pi;
268 __u8 pty;
269 __u8 ps_repeatcount;
Ayaz Ahmad1c0db522012-08-27 17:52:51 +0530270 __u8 ps_num;
Ankur Nandwanid928d542011-08-11 13:15:41 -0700271 __u8 ps_data[TX_PS_DATA_LENGTH];
272} __packed;
273
274struct hci_fm_tx_rt {
275 __u8 rt_control;
276 __u16 pi;
277 __u8 pty;
Ayaz Ahmad1c0db522012-08-27 17:52:51 +0530278 __u8 rt_len;
Ankur Nandwanid928d542011-08-11 13:15:41 -0700279 __u8 rt_data[TX_RT_DATA_LENGTH];
280} __packed;
281
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700282struct hci_fm_mute_mode_req {
283 __u8 hard_mute;
284 __u8 soft_mute;
285} __packed;
286
287struct hci_fm_stereo_mode_req {
288 __u8 stereo_mode;
289 __u8 sig_blend;
290 __u8 intf_blend;
291 __u8 most_switch;
292} __packed;
293
294struct hci_fm_search_station_req {
295 __u8 srch_mode;
296 __u8 scan_time;
297 __u8 srch_dir;
298} __packed;
299
300struct hci_fm_search_rds_station_req {
301 struct hci_fm_search_station_req srch_station;
302 __u8 srch_pty;
303 __u16 srch_pi;
304} __packed;
305
306struct hci_fm_search_station_list_req {
307 __u8 srch_list_mode;
308 __u8 srch_list_dir;
309 __u32 srch_list_max;
310 __u8 srch_pty;
311} __packed;
312
313struct hci_fm_rds_grp_req {
314 __u32 rds_grp_enable_mask;
315 __u32 rds_buf_size;
316 __u8 en_rds_change_filter;
317} __packed;
318
319struct hci_fm_en_avd_ctrl_req {
320 __u8 no_freqs;
321 __u8 freq_index;
322 __u8 lo_shft;
323 __u16 freq_min;
324 __u16 freq_max;
325} __packed;
326
327struct hci_fm_def_data_rd_req {
328 __u8 mode;
329 __u8 length;
Venkateshwarlu Domakonda787af692011-10-14 21:23:03 +0530330 __u8 param_len;
331 __u8 param;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700332} __packed;
333
334struct hci_fm_def_data_wr_req {
Venkateshwarlu Domakonda787af692011-10-14 21:23:03 +0530335 __u8 mode;
336 __u8 length;
337 __u8 data[DEFAULT_DATA_SIZE];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700338} __packed;
339
Srinivasa Rao Uppalaabc8efa2011-08-02 14:31:30 -0700340struct hci_fm_riva_data {
341 __u8 subopcode;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700342 __u32 start_addr;
343 __u8 length;
344} __packed;
345
Srinivasa Rao Uppalaabc8efa2011-08-02 14:31:30 -0700346struct hci_fm_riva_poke {
347 struct hci_fm_riva_data cmd_params;
348 __u8 data[MAX_RIVA_PEEK_RSP_SIZE];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700349} __packed;
350
351struct hci_fm_ssbi_req {
352 __u16 start_addr;
353 __u8 data;
354} __packed;
Srinivasa Rao Uppalaabc8efa2011-08-02 14:31:30 -0700355struct hci_fm_ssbi_peek {
356 __u16 start_address;
357} __packed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700358
Srinivasa Rao Uppalad3184a42012-01-04 21:18:01 +0530359struct hci_fm_ch_det_threshold {
360 char sinr;
361 __u8 sinr_samples;
362 __u8 low_th;
363 __u8 high_th;
364
365} __packed;
366
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700367/*HCI events*/
368#define HCI_EV_TUNE_STATUS 0x01
369#define HCI_EV_RDS_LOCK_STATUS 0x02
370#define HCI_EV_STEREO_STATUS 0x03
371#define HCI_EV_SERVICE_AVAILABLE 0x04
372#define HCI_EV_SEARCH_PROGRESS 0x05
373#define HCI_EV_SEARCH_RDS_PROGRESS 0x06
374#define HCI_EV_SEARCH_LIST_PROGRESS 0x07
375#define HCI_EV_RDS_RX_DATA 0x08
376#define HCI_EV_PROGRAM_SERVICE 0x09
377#define HCI_EV_RADIO_TEXT 0x0A
378#define HCI_EV_FM_AF_LIST 0x0B
379#define HCI_EV_TX_RDS_GRP_AVBLE 0x0C
380#define HCI_EV_TX_RDS_GRP_COMPL 0x0D
381#define HCI_EV_TX_RDS_CONT_GRP_COMPL 0x0E
382#define HCI_EV_CMD_COMPLETE 0x0F
383#define HCI_EV_CMD_STATUS 0x10
384#define HCI_EV_TUNE_COMPLETE 0x11
385#define HCI_EV_SEARCH_COMPLETE 0x12
386#define HCI_EV_SEARCH_RDS_COMPLETE 0x13
387#define HCI_EV_SEARCH_LIST_COMPLETE 0x14
388
389#define HCI_REQ_DONE 0
390#define HCI_REQ_PEND 1
391#define HCI_REQ_CANCELED 2
392#define HCI_REQ_STATUS 3
393
Ayaz Ahmad89265112012-10-05 19:39:11 +0530394#define MAX_RAW_RDS_GRPS 21
395
396#define RDSGRP_DATA_OFFSET 0x1
397
398/*RT PLUS*/
399#define DUMMY_CLASS 0
400#define RT_PLUS_LEN_1_TAG 3
401#define RT_ERT_FLAG_BIT 5
402
403/*TAG1*/
404#define TAG1_MSB_OFFSET 3
405#define TAG1_MSB_MASK 7
406#define TAG1_LSB_OFFSET 5
407#define TAG1_POS_MSB_MASK 31
408#define TAG1_POS_MSB_OFFSET 1
409#define TAG1_POS_LSB_OFFSET 7
410#define TAG1_LEN_OFFSET 1
411#define TAG1_LEN_MASK 63
412
413/*TAG2*/
414#define TAG2_MSB_OFFSET 5
415#define TAG2_MSB_MASK 1
416#define TAG2_LSB_OFFSET 3
417#define TAG2_POS_MSB_MASK 7
418#define TAG2_POS_MSB_OFFSET 3
419#define TAG2_POS_LSB_OFFSET 5
420#define TAG2_LEN_MASK 31
421
422#define AGT_MASK 31
423/*Extract 5 left most bits of lsb of 2nd block*/
424#define AGT(x) (x & AGT_MASK)
425/*16 bits of 4th block*/
426#define AID(lsb, msb) ((msb << 8) | (lsb))
427/*Extract 5 right most bits of msb of 2nd block*/
428#define GTC(blk2msb) (blk2msb >> 3)
429
430#define GRP_3A 0x6
431#define RT_PLUS_AID 0x4bd7
432
433/*ERT*/
434#define ERT_AID 0x6552
435#define CARRIAGE_RETURN 0x000D
436#define MAX_ERT_SEGMENT 31
437#define ERT_FORMAT_DIR_BIT 1
438
439#define EXTRACT_BIT(data, bit_pos) ((data & (1 << bit_pos)) >> bit_pos)
440
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700441struct hci_ev_tune_status {
442 __u8 sub_event;
443 __le32 station_freq;
444 __u8 serv_avble;
445 __u8 rssi;
446 __u8 stereo_prg;
447 __u8 rds_sync_status;
448 __u8 mute_mode;
Srinivasa Rao Uppalaacdebcc2011-12-23 14:31:38 +0530449 char sinr;
450 __u8 intf_det_th;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700451} __packed;
452
Ayaz Ahmad89265112012-10-05 19:39:11 +0530453struct rds_blk_data {
454 __u8 rdsMsb;
455 __u8 rdsLsb;
456 __u8 blockStatus;
457} __packed;
458
459struct rds_grp_data {
460 struct rds_blk_data rdsBlk[4];
461} __packed;
462
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700463struct hci_ev_rds_rx_data {
464 __u8 num_rds_grps;
Ayaz Ahmad89265112012-10-05 19:39:11 +0530465 struct rds_grp_data rds_grp_data[MAX_RAW_RDS_GRPS];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700466} __packed;
467
468struct hci_ev_prg_service {
469 __le16 pi_prg_id;
470 __u8 pty_prg_type;
471 __u8 ta_prg_code_type;
472 __u8 ta_ann_code_flag;
473 __u8 ms_switch_code_flag;
474 __u8 dec_id_ctrl_code_flag;
475 __u8 ps_num;
476 __u8 prg_service_name[119];
477} __packed;
478
479struct hci_ev_radio_text {
480 __le16 pi_prg_id;
481 __u8 pty_prg_type;
482 __u8 ta_prg_code_type;
483 __u8 txt_ab_flag;
484 __u8 radio_txt[64];
485} __packed;
486
487struct hci_ev_af_list {
488 __le32 tune_freq;
489 __le16 pi_code;
490 __u8 af_size;
Venkateshwarlu Domakondae8a4187c2013-06-25 18:56:54 +0530491 __u8 af_list[FM_AF_LIST_MAX_SIZE];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700492} __packed;
493
494struct hci_ev_cmd_complete {
495 __u8 num_hci_cmd_pkts;
496 __le16 cmd_opcode;
497} __packed;
498
499struct hci_ev_cmd_status {
500 __u8 status;
501 __u8 num_hci_cmd_pkts;
502 __le16 status_opcode;
503} __packed;
504
505struct hci_ev_srch_st {
506 __le32 station_freq;
507 __u8 rds_cap;
508 __u8 pty;
509 __le16 status_opcode;
510} __packed;
511
Srinivasa Rao Uppala18fb80e2011-07-17 17:33:00 -0700512struct hci_ev_rel_freq {
513 __u8 rel_freq_msb;
514 __u8 rel_freq_lsb;
515
516} __packed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700517struct hci_ev_srch_list_compl {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700518 __u8 num_stations_found;
Srinivasa Rao Uppala18fb80e2011-07-17 17:33:00 -0700519 struct hci_ev_rel_freq rel_freq[20];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700520} __packed;
521
522/* ----- HCI Event Response ----- */
523struct hci_fm_conf_rsp {
524 __u8 status;
525 struct hci_fm_recv_conf_req recv_conf_rsp;
526} __packed;
527
Srinivasa Rao Uppalac5320c22011-11-28 14:28:51 +0530528struct hci_fm_get_trans_conf_rsp {
529 __u8 status;
530 struct hci_fm_trans_conf_req_struct trans_conf_rsp;
531} __packed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700532struct hci_fm_sig_threshold_rsp {
533 __u8 status;
534 __u8 sig_threshold;
535} __packed;
536
537struct hci_fm_station_rsp {
538 struct hci_ev_tune_status station_rsp;
539} __packed;
540
541struct hci_fm_prgm_srv_rsp {
542 __u8 status;
543 struct hci_ev_prg_service prg_srv;
544} __packed;
545
546struct hci_fm_radio_txt_rsp {
547 __u8 status;
548 struct hci_ev_radio_text rd_txt;
549} __packed;
550
551struct hci_fm_af_list_rsp {
552 __u8 status;
553 struct hci_ev_af_list rd_txt;
554} __packed;
555
556struct hci_fm_data_rd_rsp {
557 __u8 status;
558 __u8 ret_data_len;
Venkateshwarlu Domakonda787af692011-10-14 21:23:03 +0530559 __u8 data[DEFAULT_DATA_SIZE];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700560} __packed;
561
562struct hci_fm_feature_list_rsp {
563 __u8 status;
564 __u8 feature_mask;
565} __packed;
566
567struct hci_fm_dbg_param_rsp {
568 __u8 status;
569 __u8 blend;
570 __u8 soft_mute;
571 __u8 inf_blend;
572 __u8 inf_soft_mute;
573 __u8 pilot_pil;
574 __u8 io_verc;
575 __u8 in_det_out;
576} __packed;
577
Anantha Krishnanf950e322012-06-06 14:25:49 +0530578#define CLKSPURID_INDEX0 0
579#define CLKSPURID_INDEX1 5
580#define CLKSPURID_INDEX2 10
581#define CLKSPURID_INDEX3 15
582#define CLKSPURID_INDEX4 20
583#define CLKSPURID_INDEX5 25
584
585#define MAX_SPUR_FREQ_LIMIT 30
586#define CKK_SPUR 0x3B
587#define SPUR_DATA_SIZE 0x4
588#define SPUR_ENTRIES_PER_ID 0x5
589
590#define COMPUTE_SPUR(val) ((((val) - (76000)) / (50)))
591#define GET_FREQ(val, bit) ((bit == 1) ? ((val) >> 8) : ((val) & 0xFF))
592#define GET_SPUR_ENTRY_LEVEL(val) ((val) / (5))
593
594struct hci_fm_spur_data {
595 __u32 freq[MAX_SPUR_FREQ_LIMIT];
596 __s8 rmssi[MAX_SPUR_FREQ_LIMIT];
597 __u8 enable[MAX_SPUR_FREQ_LIMIT];
598} __packed;
599
600
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700601/* HCI dev events */
602#define RADIO_HCI_DEV_REG 1
603#define RADIO_HCI_DEV_WRITE 2
604
605#define hci_req_lock(d) mutex_lock(&d->req_lock)
606#define hci_req_unlock(d) mutex_unlock(&d->req_lock)
607
Ankur Nandwani78a782b2011-07-07 21:11:21 -0700608/* FM RDS */
Ankur Nandwani42462512011-07-15 17:08:24 -0700609#define RDS_PTYPE 2
610#define RDS_PID_LOWER 1
611#define RDS_PID_HIGHER 0
Ankur Nandwani78a782b2011-07-07 21:11:21 -0700612#define RDS_OFFSET 5
613#define RDS_PS_LENGTH_OFFSET 7
614#define RDS_STRING 8
615#define RDS_PS_DATA_OFFSET 8
Srinivasa Rao Uppala58273f82011-08-10 19:07:45 -0700616#define RDS_CONFIG_OFFSET 3
Srinivasa Rao Uppala3c7a8eb2011-09-18 09:10:21 +0530617#define RDS_AF_JUMP_OFFSET 4
618#define PI_CODE_OFFSET 4
619#define AF_SIZE_OFFSET 6
620#define AF_LIST_OFFSET 7
Ayaz Ahmade4a0c172013-06-27 17:32:30 +0530621#define RT_A_B_FLAG_OFFSET 4
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700622/*FM states*/
623
624enum radio_state_t {
625 FM_OFF,
626 FM_RECV,
627 FM_TRANS,
628 FM_RESET,
Ayaz Ahmadc1e6a952012-05-15 19:29:54 +0530629 FM_CALIB
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700630};
631
Ankur Nandwanid928d542011-08-11 13:15:41 -0700632enum emphasis_type {
633 FM_RX_EMP75 = 0x0,
634 FM_RX_EMP50 = 0x1
635};
636
637enum channel_space_type {
638 FM_RX_SPACE_200KHZ = 0x0,
639 FM_RX_SPACE_100KHZ = 0x1,
640 FM_RX_SPACE_50KHZ = 0x2
641};
642
643enum high_low_injection {
644 AUTO_HI_LO_INJECTION = 0x0,
645 LOW_SIDE_INJECTION = 0x1,
646 HIGH_SIDE_INJECTION = 0x2
647};
648
649enum fm_rds_type {
650 FM_RX_RDBS_SYSTEM = 0x0,
651 FM_RX_RDS_SYSTEM = 0x1
652};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700653
654enum iris_region_t {
655 IRIS_REGION_US,
656 IRIS_REGION_EU,
657 IRIS_REGION_JAPAN,
658 IRIS_REGION_JAPAN_WIDE,
659 IRIS_REGION_OTHER
660};
661
Ayaz Ahmad89265112012-10-05 19:39:11 +0530662#define STD_BUF_SIZE (256)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700663
664enum iris_buf_t {
665 IRIS_BUF_SRCH_LIST,
666 IRIS_BUF_EVENTS,
667 IRIS_BUF_RT_RDS,
668 IRIS_BUF_PS_RDS,
669 IRIS_BUF_RAW_RDS,
670 IRIS_BUF_AF_LIST,
Srinivasa Rao Uppalaabc8efa2011-08-02 14:31:30 -0700671 IRIS_BUF_PEEK,
672 IRIS_BUF_SSBI_PEEK,
Srinivasa Rao Uppala0f4098f2011-09-06 16:46:28 +0530673 IRIS_BUF_RDS_CNTRS,
Venkateshwarlu Domakonda787af692011-10-14 21:23:03 +0530674 IRIS_BUF_RD_DEFAULT,
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530675 IRIS_BUF_CAL_DATA,
Ayaz Ahmad89265112012-10-05 19:39:11 +0530676 IRIS_BUF_RT_PLUS,
677 IRIS_BUF_ERT,
678 IRIS_BUF_MAX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700679};
680
681enum iris_xfr_t {
682 IRIS_XFR_SYNC,
683 IRIS_XFR_ERROR,
684 IRIS_XFR_SRCH_LIST,
685 IRIS_XFR_RT_RDS,
686 IRIS_XFR_PS_RDS,
687 IRIS_XFR_AF_LIST,
688 IRIS_XFR_MAX
689};
690
691#undef FMDBG
692#ifdef FM_DEBUG
693#define FMDBG(fmt, args...) pr_info("iris_radio: " fmt, ##args)
694#else
695#define FMDBG(fmt, args...)
696#endif
697
698#undef FMDERR
699#define FMDERR(fmt, args...) pr_err("iris_radio: " fmt, ##args)
700
701/* Search options */
702enum search_t {
703 SEEK,
704 SCAN,
705 SCAN_FOR_STRONG,
706 SCAN_FOR_WEAK,
707 RDS_SEEK_PTY,
708 RDS_SCAN_PTY,
709 RDS_SEEK_PI,
710 RDS_AF_JUMP,
711};
712
Anantha Krishnanf950e322012-06-06 14:25:49 +0530713enum spur_entry_levels {
714 ENTRY_0,
715 ENTRY_1,
716 ENTRY_2,
717 ENTRY_3,
718 ENTRY_4,
719 ENTRY_5,
720};
Ankur Nandwanid928d542011-08-11 13:15:41 -0700721
722/* Band limits */
723#define REGION_US_EU_BAND_LOW 87500
Ayaz Ahmadb69202b2012-02-23 19:24:46 +0530724#define REGION_US_EU_BAND_HIGH 108000
Ankur Nandwanid928d542011-08-11 13:15:41 -0700725#define REGION_JAPAN_STANDARD_BAND_LOW 76000
726#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
727#define REGION_JAPAN_WIDE_BAND_LOW 90000
728#define REGION_JAPAN_WIDE_BAND_HIGH 108000
729
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700730#define SRCH_MODE 0x07
731#define SRCH_DIR 0x08 /* 0-up 1-down */
732#define SCAN_DWELL 0x70
733#define SRCH_ON 0x80
734
735/* I/O Control */
736#define IOC_HRD_MUTE 0x03
737#define IOC_SFT_MUTE 0x01
738#define IOC_MON_STR 0x01
739#define IOC_SIG_BLND 0x01
740#define IOC_INTF_BLND 0x01
741#define IOC_ANTENNA 0x01
742
743/* RDS Control */
744#define RDS_ON 0x01
745#define RDS_BUF_SZ 100
746
Ankur Nandwanid928d542011-08-11 13:15:41 -0700747/* constants */
748#define RDS_BLOCKS_NUM (4)
749#define BYTES_PER_BLOCK (3)
Ayaz Ahmad1c0db522012-08-27 17:52:51 +0530750#define MAX_PS_LENGTH (108)
Ankur Nandwanid928d542011-08-11 13:15:41 -0700751#define MAX_RT_LENGTH (64)
Srinivasa Rao Uppala0f4098f2011-09-06 16:46:28 +0530752#define RDS_GRP_CNTR_LEN (36)
Srinivasa Rao Uppala69839842012-01-13 18:36:12 +0530753#define RX_RT_DATA_LENGTH (63)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700754/* Search direction */
755#define SRCH_DIR_UP (0)
756#define SRCH_DIR_DOWN (1)
757
Srinivasa Rao Uppala7bb22102011-07-14 11:27:30 -0700758/*Search RDS stations*/
759#define SEARCH_RDS_STNS_MODE_OFFSET 4
Srinivasa Rao Uppala18fb80e2011-07-17 17:33:00 -0700760
761/*Search Station list */
Srinivasa Rao Uppala4b92e4b2011-08-09 15:46:25 -0700762#define PARAMS_PER_STATION 0x08
Srinivasa Rao Uppala18fb80e2011-07-17 17:33:00 -0700763#define STN_NUM_OFFSET 0x01
764#define STN_FREQ_OFFSET 0x02
765#define KHZ_TO_MHZ 1000
766#define GET_MSB(x)((x >> 8) & 0xFF)
767#define GET_LSB(x)((x) & 0xFF)
768
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700769/* control options */
770#define CTRL_ON (1)
771#define CTRL_OFF (0)
772
Srinivasa Rao Uppalaabc8efa2011-08-02 14:31:30 -0700773/*Diagnostic commands*/
774
775#define RIVA_PEEK_OPCODE 0x0D
776#define RIVA_POKE_OPCODE 0x0C
777
778#define PEEK_DATA_OFSET 0x1
779#define RIVA_PEEK_PARAM 0x6
780#define RIVA_PEEK_LEN_OFSET 0x6
781#define SSBI_PEEK_LEN 0x01
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530782/*Calibration data*/
783#define PROCS_CALIB_MODE 1
784#define PROCS_CALIB_SIZE 23
785#define DC_CALIB_MODE 2
786#define DC_CALIB_SIZE 48
787#define RSB_CALIB_MODE 3
788#define RSB_CALIB_SIZE 4
789#define CALIB_DATA_OFSET 2
790#define CALIB_MODE_OFSET 1
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530791#define MAX_CALIB_SIZE 75
Ayaz Ahmad37294ba2012-07-10 16:38:11 +0530792
793/* Channel validity */
794#define INVALID_CHANNEL (0)
795#define VALID_CHANNEL (1)
796
Venkateshwarlu Domakonda3a0b75d2011-11-23 17:03:27 +0530797struct hci_fm_set_cal_req_proc {
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530798 __u8 mode;
Venkateshwarlu Domakonda3a0b75d2011-11-23 17:03:27 +0530799 /*Max process calibration data size*/
800 __u8 data[PROCS_CALIB_SIZE];
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530801} __packed;
Venkateshwarlu Domakonda3a0b75d2011-11-23 17:03:27 +0530802
803struct hci_fm_set_cal_req_dc {
804 __u8 mode;
805 /*Max DC calibration data size*/
806 __u8 data[DC_CALIB_SIZE];
807} __packed;
808
Srinivasa Rao Uppalacb48ee62011-10-25 09:57:06 +0530809struct hci_cc_do_calibration_rsp {
810 __u8 status;
811 __u8 mode;
812 __u8 data[MAX_CALIB_SIZE];
813} __packed;
Srinivasa Rao Uppalaf856ae62011-10-17 18:43:26 +0530814
815/* Low Power mode*/
816#define SIG_LEVEL_INTR (1 << 0)
817#define RDS_SYNC_INTR (1 << 1)
818#define AUDIO_CTRL_INTR (1 << 2)
819#define AF_JUMP_ENABLE (1 << 4)
Anantha Krishnanf950e322012-06-06 14:25:49 +0530820
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700821int hci_def_data_read(struct hci_fm_def_data_rd_req *arg,
822 struct radio_hci_dev *hdev);
823int hci_def_data_write(struct hci_fm_def_data_wr_req *arg,
824 struct radio_hci_dev *hdev);
825int hci_fm_do_calibration(__u8 *arg, struct radio_hci_dev *hdev);
826int hci_fm_do_calibration(__u8 *arg, struct radio_hci_dev *hdev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700827
828#endif /* __RADIO_HCI_CORE_H */