ssp.h (7598B)
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 SSP_HEADER_BUFFER_SIZE 4 29 30enum { 31 SSP_KERNEL_BINARY = 0, 32 SSP_KERNEL_CRASHED_BINARY, 33}; 34 35enum { 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 */ 43enum { 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 123struct 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 */ 179struct 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 header_buffer[SSP_HEADER_BUFFER_SIZE / sizeof(__le16)] 225 ____cacheline_aligned; 226}; 227 228void ssp_clean_pending_list(struct ssp_data *data); 229 230int ssp_command(struct ssp_data *data, char command, int arg); 231 232int ssp_send_instruction(struct ssp_data *data, u8 inst, u8 sensor_type, 233 u8 *send_buf, u8 length); 234 235int ssp_irq_msg(struct ssp_data *data); 236 237int ssp_get_chipid(struct ssp_data *data); 238 239int ssp_set_magnetic_matrix(struct ssp_data *data); 240 241unsigned int ssp_get_sensor_scanning_info(struct ssp_data *data); 242 243unsigned int ssp_get_firmware_rev(struct ssp_data *data); 244 245int ssp_queue_ssp_refresh_task(struct ssp_data *data, unsigned int delay); 246 247#endif /* __SSP_SENSORHUB_H__ */