1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright (C) 2014, Samsung Electronics Co. Ltd. All Rights Reserved. |
4 | */ |
5 | |
6 | #ifndef __SSP_SENSORHUB_H__ |
7 | #define __SSP_SENSORHUB_H__ |
8 | |
9 | #include <linux/delay.h> |
10 | #include <linux/gpio/consumer.h> |
11 | #include <linux/iio/common/ssp_sensors.h> |
12 | #include <linux/iio/iio.h> |
13 | #include <linux/spi/spi.h> |
14 | |
15 | #define SSP_DEVICE_ID 0x55 |
16 | |
17 | #ifdef SSP_DBG |
18 | #define ssp_dbg(format, ...) pr_info("[SSP] "format, ##__VA_ARGS__) |
19 | #else |
20 | #define ssp_dbg(format, ...) |
21 | #endif |
22 | |
23 | #define SSP_SW_RESET_TIME 3000 |
24 | /* Sensor polling in ms */ |
25 | #define SSP_DEFAULT_POLLING_DELAY 200 |
26 | #define SSP_DEFAULT_RETRIES 3 |
27 | #define SSP_DATA_PACKET_SIZE 960 |
28 | #define 4 |
29 | |
30 | enum { |
31 | SSP_KERNEL_BINARY = 0, |
32 | SSP_KERNEL_CRASHED_BINARY, |
33 | }; |
34 | |
35 | enum { |
36 | SSP_INITIALIZATION_STATE = 0, |
37 | SSP_NO_SENSOR_STATE, |
38 | SSP_ADD_SENSOR_STATE, |
39 | SSP_RUNNING_SENSOR_STATE, |
40 | }; |
41 | |
42 | /* Firmware download STATE */ |
43 | enum { |
44 | SSP_FW_DL_STATE_FAIL = -1, |
45 | SSP_FW_DL_STATE_NONE = 0, |
46 | SSP_FW_DL_STATE_NEED_TO_SCHEDULE, |
47 | SSP_FW_DL_STATE_SCHEDULED, |
48 | SSP_FW_DL_STATE_DOWNLOADING, |
49 | SSP_FW_DL_STATE_SYNC, |
50 | SSP_FW_DL_STATE_DONE, |
51 | }; |
52 | |
53 | #define SSP_INVALID_REVISION 99999 |
54 | #define SSP_INVALID_REVISION2 0xffffff |
55 | |
56 | /* AP -> SSP Instruction */ |
57 | #define SSP_MSG2SSP_INST_BYPASS_SENSOR_ADD 0xa1 |
58 | #define SSP_MSG2SSP_INST_BYPASS_SENSOR_RM 0xa2 |
59 | #define SSP_MSG2SSP_INST_REMOVE_ALL 0xa3 |
60 | #define SSP_MSG2SSP_INST_CHANGE_DELAY 0xa4 |
61 | #define SSP_MSG2SSP_INST_LIBRARY_ADD 0xb1 |
62 | #define SSP_MSG2SSP_INST_LIBRARY_REMOVE 0xb2 |
63 | #define SSP_MSG2SSP_INST_LIB_NOTI 0xb4 |
64 | #define SSP_MSG2SSP_INST_LIB_DATA 0xc1 |
65 | |
66 | #define SSP_MSG2SSP_AP_MCU_SET_GYRO_CAL 0xcd |
67 | #define SSP_MSG2SSP_AP_MCU_SET_ACCEL_CAL 0xce |
68 | #define SSP_MSG2SSP_AP_STATUS_SHUTDOWN 0xd0 |
69 | #define SSP_MSG2SSP_AP_STATUS_WAKEUP 0xd1 |
70 | #define SSP_MSG2SSP_AP_STATUS_SLEEP 0xd2 |
71 | #define SSP_MSG2SSP_AP_STATUS_RESUME 0xd3 |
72 | #define SSP_MSG2SSP_AP_STATUS_SUSPEND 0xd4 |
73 | #define SSP_MSG2SSP_AP_STATUS_RESET 0xd5 |
74 | #define SSP_MSG2SSP_AP_STATUS_POW_CONNECTED 0xd6 |
75 | #define SSP_MSG2SSP_AP_STATUS_POW_DISCONNECTED 0xd7 |
76 | #define SSP_MSG2SSP_AP_TEMPHUMIDITY_CAL_DONE 0xda |
77 | #define SSP_MSG2SSP_AP_MCU_SET_DUMPMODE 0xdb |
78 | #define SSP_MSG2SSP_AP_MCU_DUMP_CHECK 0xdc |
79 | #define SSP_MSG2SSP_AP_MCU_BATCH_FLUSH 0xdd |
80 | #define SSP_MSG2SSP_AP_MCU_BATCH_COUNT 0xdf |
81 | |
82 | #define SSP_MSG2SSP_AP_WHOAMI 0x0f |
83 | #define SSP_MSG2SSP_AP_FIRMWARE_REV 0xf0 |
84 | #define SSP_MSG2SSP_AP_SENSOR_FORMATION 0xf1 |
85 | #define SSP_MSG2SSP_AP_SENSOR_PROXTHRESHOLD 0xf2 |
86 | #define SSP_MSG2SSP_AP_SENSOR_BARCODE_EMUL 0xf3 |
87 | #define SSP_MSG2SSP_AP_SENSOR_SCANNING 0xf4 |
88 | #define SSP_MSG2SSP_AP_SET_MAGNETIC_HWOFFSET 0xf5 |
89 | #define SSP_MSG2SSP_AP_GET_MAGNETIC_HWOFFSET 0xf6 |
90 | #define SSP_MSG2SSP_AP_SENSOR_GESTURE_CURRENT 0xf7 |
91 | #define SSP_MSG2SSP_AP_GET_THERM 0xf8 |
92 | #define SSP_MSG2SSP_AP_GET_BIG_DATA 0xf9 |
93 | #define SSP_MSG2SSP_AP_SET_BIG_DATA 0xfa |
94 | #define SSP_MSG2SSP_AP_START_BIG_DATA 0xfb |
95 | #define SSP_MSG2SSP_AP_SET_MAGNETIC_STATIC_MATRIX 0xfd |
96 | #define SSP_MSG2SSP_AP_SENSOR_TILT 0xea |
97 | #define SSP_MSG2SSP_AP_MCU_SET_TIME 0xfe |
98 | #define SSP_MSG2SSP_AP_MCU_GET_TIME 0xff |
99 | |
100 | #define SSP_MSG2SSP_AP_FUSEROM 0x01 |
101 | |
102 | /* voice data */ |
103 | #define SSP_TYPE_WAKE_UP_VOICE_SERVICE 0x01 |
104 | #define SSP_TYPE_WAKE_UP_VOICE_SOUND_SOURCE_AM 0x01 |
105 | #define SSP_TYPE_WAKE_UP_VOICE_SOUND_SOURCE_GRAMMER 0x02 |
106 | |
107 | /* Factory Test */ |
108 | #define SSP_ACCELEROMETER_FACTORY 0x80 |
109 | #define SSP_GYROSCOPE_FACTORY 0x81 |
110 | #define SSP_GEOMAGNETIC_FACTORY 0x82 |
111 | #define SSP_PRESSURE_FACTORY 0x85 |
112 | #define SSP_GESTURE_FACTORY 0x86 |
113 | #define SSP_TEMPHUMIDITY_CRC_FACTORY 0x88 |
114 | #define SSP_GYROSCOPE_TEMP_FACTORY 0x8a |
115 | #define SSP_GYROSCOPE_DPS_FACTORY 0x8b |
116 | #define SSP_MCU_FACTORY 0x8c |
117 | #define SSP_MCU_SLEEP_FACTORY 0x8d |
118 | |
119 | /* SSP -> AP ACK about write CMD */ |
120 | #define SSP_MSG_ACK 0x80 /* ACK from SSP to AP */ |
121 | #define SSP_MSG_NAK 0x70 /* NAK from SSP to AP */ |
122 | |
123 | struct ssp_sensorhub_info { |
124 | char *fw_name; |
125 | char *fw_crashed_name; |
126 | unsigned int fw_rev; |
127 | const u8 * const mag_table; |
128 | const unsigned int mag_length; |
129 | }; |
130 | |
131 | /* ssp_msg options bit */ |
132 | #define SSP_RW 0 |
133 | #define SSP_INDEX 3 |
134 | |
135 | #define SSP_AP2HUB_READ 0 |
136 | #define SSP_AP2HUB_WRITE 1 |
137 | #define SSP_HUB2AP_WRITE 2 |
138 | #define SSP_AP2HUB_READY 3 |
139 | #define SSP_AP2HUB_RETURN 4 |
140 | |
141 | /** |
142 | * struct ssp_data - ssp platformdata structure |
143 | * @spi: spi device |
144 | * @sensorhub_info: info about sensorhub board specific features |
145 | * @wdt_timer: watchdog timer |
146 | * @work_wdt: watchdog work |
147 | * @work_firmware: firmware upgrade work queue |
148 | * @work_refresh: refresh work queue for reset request from MCU |
149 | * @shut_down: shut down flag |
150 | * @mcu_dump_mode: mcu dump mode for debug |
151 | * @time_syncing: time syncing indication flag |
152 | * @timestamp: previous time in ns calculated for time syncing |
153 | * @check_status: status table for each sensor |
154 | * @com_fail_cnt: communication fail count |
155 | * @reset_cnt: reset count |
156 | * @timeout_cnt: timeout count |
157 | * @available_sensors: available sensors seen by sensorhub (bit array) |
158 | * @cur_firm_rev: cached current firmware revision |
159 | * @last_resume_state: last AP resume/suspend state used to handle the PM |
160 | * state of ssp |
161 | * @last_ap_state: (obsolete) sleep notification for MCU |
162 | * @sensor_enable: sensor enable mask |
163 | * @delay_buf: data acquisition intervals table |
164 | * @batch_latency_buf: yet unknown but existing in communication protocol |
165 | * @batch_opt_buf: yet unknown but existing in communication protocol |
166 | * @accel_position: yet unknown but existing in communication protocol |
167 | * @mag_position: yet unknown but existing in communication protocol |
168 | * @fw_dl_state: firmware download state |
169 | * @comm_lock: lock protecting the handshake |
170 | * @pending_lock: lock protecting pending list and completion |
171 | * @mcu_reset_gpiod: mcu reset line |
172 | * @ap_mcu_gpiod: ap to mcu gpio line |
173 | * @mcu_ap_gpiod: mcu to ap gpio line |
174 | * @pending_list: pending list for messages queued to be sent/read |
175 | * @sensor_devs: registered IIO devices table |
176 | * @enable_refcount: enable reference count for wdt (watchdog timer) |
177 | * @header_buffer: cache aligned buffer for packet header |
178 | */ |
179 | struct ssp_data { |
180 | struct spi_device *spi; |
181 | const struct ssp_sensorhub_info *sensorhub_info; |
182 | struct timer_list wdt_timer; |
183 | struct work_struct work_wdt; |
184 | struct delayed_work work_refresh; |
185 | |
186 | bool shut_down; |
187 | bool mcu_dump_mode; |
188 | bool time_syncing; |
189 | int64_t timestamp; |
190 | |
191 | int check_status[SSP_SENSOR_MAX]; |
192 | |
193 | unsigned int com_fail_cnt; |
194 | unsigned int reset_cnt; |
195 | unsigned int timeout_cnt; |
196 | |
197 | unsigned int available_sensors; |
198 | unsigned int cur_firm_rev; |
199 | |
200 | char last_resume_state; |
201 | char last_ap_state; |
202 | |
203 | unsigned int sensor_enable; |
204 | u32 delay_buf[SSP_SENSOR_MAX]; |
205 | s32 batch_latency_buf[SSP_SENSOR_MAX]; |
206 | s8 batch_opt_buf[SSP_SENSOR_MAX]; |
207 | |
208 | int accel_position; |
209 | int mag_position; |
210 | int fw_dl_state; |
211 | |
212 | struct mutex comm_lock; |
213 | struct mutex pending_lock; |
214 | |
215 | struct gpio_desc *mcu_reset_gpiod; |
216 | struct gpio_desc *ap_mcu_gpiod; |
217 | struct gpio_desc *mcu_ap_gpiod; |
218 | |
219 | struct list_head pending_list; |
220 | |
221 | struct iio_dev *sensor_devs[SSP_SENSOR_MAX]; |
222 | atomic_t enable_refcount; |
223 | |
224 | __le16 [SSP_HEADER_BUFFER_SIZE / sizeof(__le16)] __aligned(IIO_DMA_MINALIGN); |
225 | }; |
226 | |
227 | void ssp_clean_pending_list(struct ssp_data *data); |
228 | |
229 | int ssp_command(struct ssp_data *data, char command, int arg); |
230 | |
231 | int ssp_send_instruction(struct ssp_data *data, u8 inst, u8 sensor_type, |
232 | u8 *send_buf, u8 length); |
233 | |
234 | int ssp_irq_msg(struct ssp_data *data); |
235 | |
236 | int ssp_get_chipid(struct ssp_data *data); |
237 | |
238 | int ssp_set_magnetic_matrix(struct ssp_data *data); |
239 | |
240 | unsigned int ssp_get_sensor_scanning_info(struct ssp_data *data); |
241 | |
242 | unsigned int ssp_get_firmware_rev(struct ssp_data *data); |
243 | |
244 | int ssp_queue_ssp_refresh_task(struct ssp_data *data, unsigned int delay); |
245 | |
246 | #endif /* __SSP_SENSORHUB_H__ */ |
247 | |