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 40enum { 41 SSP_KERNEL_BINARY = 0, 42 SSP_KERNEL_CRASHED_BINARY, 43}; 44 45enum { 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 */ 53enum { 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 133struct 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 */ 189struct ssp_data { 190 struct spi_device *spi; 191 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 238void ssp_clean_pending_list(struct ssp_data *data); 239 240int ssp_command(struct ssp_data *data, char command, int arg); 241 242int ssp_send_instruction(struct ssp_data *data, u8 inst, u8 sensor_type, 243 u8 *send_buf, u8 length); 244 245int ssp_irq_msg(struct ssp_data *data); 246 247int ssp_get_chipid(struct ssp_data *data); 248 249int ssp_set_magnetic_matrix(struct ssp_data *data); 250 251unsigned int ssp_get_sensor_scanning_info(struct ssp_data *data); 252 253unsigned int ssp_get_firmware_rev(struct ssp_data *data); 254 255int ssp_queue_ssp_refresh_task(struct ssp_data *data, unsigned int delay); 256 257#endif /* __SSP_SENSORHUB_H__ */ 258