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