blob: 49524c8dddfbb01eae6642a6767d13b6300b90ff (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#ifndef _WCNSS_CORE_H_
#define _WCNSS_CORE_H_
#define PMU_OFFSET 0x1004
#define SPARE_OFFSET 0x1088
#define IRIS_REG_OFFSET 0x1134
#define INVALID_IRIS_REG 0xbaadbaad
#define WCNSS_PMU_CFG_IRIS_XO_CFG BIT(3)
#define WCNSS_PMU_CFG_IRIS_XO_EN BIT(4)
#define WCNSS_PMU_CFG_GC_BUS_MUX_SEL_TOP BIT(5)
#define WCNSS_PMU_CFG_IRIS_XO_CFG_STS BIT(6) /* 1: in progress, 0: done */
#define WCNSS_PMU_CFG_IRIS_RESET BIT(7)
#define WCNSS_PMU_CFG_IRIS_RESET_STS BIT(8) /* 1: in progress, 0: done */
#define WCNSS_PMU_CFG_IRIS_XO_READ BIT(9)
#define WCNSS_PMU_CFG_IRIS_XO_READ_STS BIT(10)
#define WCNSS_FW_DOWNLOAD_ENABLE BIT(25)
#define WCNSS_PMU_CFG_IRIS_XO_MODE 0x6
#define WCNSS_PMU_CFG_IRIS_XO_MODE_48 (3 << 1)
#define NV_DOWNLOAD_TIMEOUT 500
#define NV_FRAGMENT_SIZE 3072
#define MAX_CALIBRATED_DATA_SIZE (64*1024)
#define LAST_FRAGMENT (1 << 0)
#define MESSAGE_TO_FOLLOW (1 << 1)
#define CAN_RECEIVE_CALDATA (1 << 15)
#define WCNSS_RESP_SUCCESS 1
#define WCNSS_RESP_FAIL 0
#define WCNSS_NV_DOWNLOAD_REQ 0x01000002
#define WCNSS_NV_DOWNLOAD_RSP 0x01000003
#define WCNSS_CBC_COMPLETE_IND 0x0100000C
/*time out 10s for the firmware status ready indicator */
#define FW_READY_TIMEOUT (10000)
struct smd_msg_hdr {
unsigned int msg_type;
unsigned int msg_len;
};
struct nvbin_dnld_req_params {
/* Fragment sequence number of the NV bin Image. NV Bin Image
* might not fit into one message due to size limitation of
* the SMD channel FIFO so entire NV blob is chopped into
* multiple fragments starting with seqeunce number 0. The
* last fragment is indicated by marking is_last_fragment field
* to 1. At receiving side, NV blobs would be concatenated
* together without any padding bytes in between.
*/
unsigned short frag_number;
/* bit 0: When set to 1 it indicates that no more fragments will
* be sent.
* bit 1: When set, a new message will be followed by this message
* bit 2- bit 14: Reserved
* bit 15: when set, it indicates that the sender is capable of
* receiving Calibrated data.
*/
unsigned short msg_flags;
/* NV Image size (number of bytes) */
unsigned int nvbin_buffer_size;
/* Following the 'nvbin_buffer_size', there should be
* nvbin_buffer_size bytes of NV bin Image i.e.
* uint8[nvbin_buffer_size].
*/
};
struct nvbin_dnld_req_msg {
/* Note: The length specified in nvbin_dnld_req_msg messages
* should be hdr.msg_len = sizeof(nvbin_dnld_req_msg) +
* nvbin_buffer_size.
*/
struct smd_msg_hdr hdr;
struct nvbin_dnld_req_params dnld_req_params;
};
struct wcnss_version {
struct smd_msg_hdr hdr;
unsigned char major;
unsigned char minor;
unsigned char version;
unsigned char revision;
};
int wcnss_core_prepare(struct platform_device *pdev);
void wcnss_core_init(void);
void wcnss_core_deinit(void);
#endif
|