ssp_spi.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2014, Samsung Electronics Co. Ltd. All Rights Reserved.
  4. */
  5. #include "ssp.h"
  6. #define SSP_DEV (&data->spi->dev)
  7. #define SSP_GET_MESSAGE_TYPE(data) (data & (3 << SSP_RW))
  8. /*
  9. * SSP -> AP Instruction
  10. * They tell what packet type can be expected. In the future there will
  11. * be less of them. BYPASS means common sensor packets with accel, gyro,
  12. * hrm etc. data. LIBRARY and META are mock-up's for now.
  13. */
  14. #define SSP_MSG2AP_INST_BYPASS_DATA 0x37
  15. #define SSP_MSG2AP_INST_LIBRARY_DATA 0x01
  16. #define SSP_MSG2AP_INST_DEBUG_DATA 0x03
  17. #define SSP_MSG2AP_INST_BIG_DATA 0x04
  18. #define SSP_MSG2AP_INST_META_DATA 0x05
  19. #define SSP_MSG2AP_INST_TIME_SYNC 0x06
  20. #define SSP_MSG2AP_INST_RESET 0x07
  21. #define SSP_UNIMPLEMENTED -1
  22. struct ssp_msg_header {
  23. u8 cmd;
  24. __le16 length;
  25. __le16 options;
  26. __le32 data;
  27. } __attribute__((__packed__));
  28. struct ssp_msg {
  29. u16 length;
  30. u16 options;
  31. struct list_head list;
  32. struct completion *done;
  33. struct ssp_msg_header *h;
  34. char *buffer;
  35. };
  36. static const int ssp_offset_map[SSP_SENSOR_MAX] = {
  37. [SSP_ACCELEROMETER_SENSOR] = SSP_ACCELEROMETER_SIZE +
  38. SSP_TIME_SIZE,
  39. [SSP_GYROSCOPE_SENSOR] = SSP_GYROSCOPE_SIZE +
  40. SSP_TIME_SIZE,
  41. [SSP_GEOMAGNETIC_UNCALIB_SENSOR] = SSP_UNIMPLEMENTED,
  42. [SSP_GEOMAGNETIC_RAW] = SSP_UNIMPLEMENTED,
  43. [SSP_GEOMAGNETIC_SENSOR] = SSP_UNIMPLEMENTED,
  44. [SSP_PRESSURE_SENSOR] = SSP_UNIMPLEMENTED,
  45. [SSP_GESTURE_SENSOR] = SSP_UNIMPLEMENTED,
  46. [SSP_PROXIMITY_SENSOR] = SSP_UNIMPLEMENTED,
  47. [SSP_TEMPERATURE_HUMIDITY_SENSOR] = SSP_UNIMPLEMENTED,
  48. [SSP_LIGHT_SENSOR] = SSP_UNIMPLEMENTED,
  49. [SSP_PROXIMITY_RAW] = SSP_UNIMPLEMENTED,
  50. [SSP_ORIENTATION_SENSOR] = SSP_UNIMPLEMENTED,
  51. [SSP_STEP_DETECTOR] = SSP_UNIMPLEMENTED,
  52. [SSP_SIG_MOTION_SENSOR] = SSP_UNIMPLEMENTED,
  53. [SSP_GYRO_UNCALIB_SENSOR] = SSP_UNIMPLEMENTED,
  54. [SSP_GAME_ROTATION_VECTOR] = SSP_UNIMPLEMENTED,
  55. [SSP_ROTATION_VECTOR] = SSP_UNIMPLEMENTED,
  56. [SSP_STEP_COUNTER] = SSP_UNIMPLEMENTED,
  57. [SSP_BIO_HRM_RAW] = SSP_BIO_HRM_RAW_SIZE +
  58. SSP_TIME_SIZE,
  59. [SSP_BIO_HRM_RAW_FAC] = SSP_BIO_HRM_RAW_FAC_SIZE +
  60. SSP_TIME_SIZE,
  61. [SSP_BIO_HRM_LIB] = SSP_BIO_HRM_LIB_SIZE +
  62. SSP_TIME_SIZE,
  63. };
  64. #define SSP_HEADER_SIZE (sizeof(struct ssp_msg_header))
  65. #define SSP_HEADER_SIZE_ALIGNED (ALIGN(SSP_HEADER_SIZE, 4))
  66. static struct ssp_msg *ssp_create_msg(u8 cmd, u16 len, u16 opt, u32 data)
  67. {
  68. struct ssp_msg_header h;
  69. struct ssp_msg *msg;
  70. msg = kzalloc(sizeof(*msg), GFP_KERNEL);
  71. if (!msg)
  72. return NULL;
  73. h.cmd = cmd;
  74. h.length = cpu_to_le16(len);
  75. h.options = cpu_to_le16(opt);
  76. h.data = cpu_to_le32(data);
  77. msg->buffer = kzalloc(SSP_HEADER_SIZE_ALIGNED + len,
  78. GFP_KERNEL | GFP_DMA);
  79. if (!msg->buffer) {
  80. kfree(msg);
  81. return NULL;
  82. }
  83. msg->length = len;
  84. msg->options = opt;
  85. memcpy(msg->buffer, &h, SSP_HEADER_SIZE);
  86. return msg;
  87. }
  88. /*
  89. * It is a bit heavy to do it this way but often the function is used to compose
  90. * the message from smaller chunks which are placed on the stack. Often the
  91. * chunks are small so memcpy should be optimalized.
  92. */
  93. static inline void ssp_fill_buffer(struct ssp_msg *m, unsigned int offset,
  94. const void *src, unsigned int len)
  95. {
  96. memcpy(&m->buffer[SSP_HEADER_SIZE_ALIGNED + offset], src, len);
  97. }
  98. static inline void ssp_get_buffer(struct ssp_msg *m, unsigned int offset,
  99. void *dest, unsigned int len)
  100. {
  101. memcpy(dest, &m->buffer[SSP_HEADER_SIZE_ALIGNED + offset], len);
  102. }
  103. #define SSP_GET_BUFFER_AT_INDEX(m, index) \
  104. (m->buffer[SSP_HEADER_SIZE_ALIGNED + index])
  105. #define SSP_SET_BUFFER_AT_INDEX(m, index, val) \
  106. (m->buffer[SSP_HEADER_SIZE_ALIGNED + index] = val)
  107. static void ssp_clean_msg(struct ssp_msg *m)
  108. {
  109. kfree(m->buffer);
  110. kfree(m);
  111. }
  112. static int ssp_print_mcu_debug(char *data_frame, int *data_index,
  113. int received_len)
  114. {
  115. int length = data_frame[(*data_index)++];
  116. if (length > received_len - *data_index || length <= 0) {
  117. ssp_dbg("[SSP]: MSG From MCU-invalid debug length(%d/%d)\n",
  118. length, received_len);
  119. return -EPROTO;
  120. }
  121. ssp_dbg("[SSP]: MSG From MCU - %s\n", &data_frame[*data_index]);
  122. *data_index += length;
  123. return 0;
  124. }
  125. /*
  126. * It was designed that way - additional lines to some kind of handshake,
  127. * please do not ask why - only the firmware guy can know it.
  128. */
  129. static int ssp_check_lines(struct ssp_data *data, bool state)
  130. {
  131. int delay_cnt = 0;
  132. gpiod_set_value_cansleep(data->ap_mcu_gpiod, state);
  133. while (gpiod_get_value_cansleep(data->mcu_ap_gpiod) != state) {
  134. usleep_range(3000, 3500);
  135. if (data->shut_down || delay_cnt++ > 500) {
  136. dev_err(SSP_DEV, "%s:timeout, hw ack wait fail %d\n",
  137. __func__, state);
  138. if (!state)
  139. gpiod_set_value_cansleep(data->ap_mcu_gpiod, 1);
  140. return -ETIMEDOUT;
  141. }
  142. }
  143. return 0;
  144. }
  145. static int ssp_do_transfer(struct ssp_data *data, struct ssp_msg *msg,
  146. struct completion *done, int timeout)
  147. {
  148. int status;
  149. /*
  150. * check if this is a short one way message or the whole transfer has
  151. * second part after an interrupt
  152. */
  153. const bool use_no_irq = msg->length == 0;
  154. if (data->shut_down)
  155. return -EPERM;
  156. msg->done = done;
  157. mutex_lock(&data->comm_lock);
  158. status = ssp_check_lines(data, false);
  159. if (status < 0)
  160. goto _error_locked;
  161. status = spi_write(data->spi, msg->buffer, SSP_HEADER_SIZE);
  162. if (status < 0) {
  163. gpiod_set_value_cansleep(data->ap_mcu_gpiod, 1);
  164. dev_err(SSP_DEV, "%s spi_write fail\n", __func__);
  165. goto _error_locked;
  166. }
  167. if (!use_no_irq) {
  168. mutex_lock(&data->pending_lock);
  169. list_add_tail(&msg->list, &data->pending_list);
  170. mutex_unlock(&data->pending_lock);
  171. }
  172. status = ssp_check_lines(data, true);
  173. if (status < 0) {
  174. if (!use_no_irq) {
  175. mutex_lock(&data->pending_lock);
  176. list_del(&msg->list);
  177. mutex_unlock(&data->pending_lock);
  178. }
  179. goto _error_locked;
  180. }
  181. mutex_unlock(&data->comm_lock);
  182. if (!use_no_irq && done)
  183. if (wait_for_completion_timeout(done,
  184. msecs_to_jiffies(timeout)) ==
  185. 0) {
  186. mutex_lock(&data->pending_lock);
  187. list_del(&msg->list);
  188. mutex_unlock(&data->pending_lock);
  189. data->timeout_cnt++;
  190. return -ETIMEDOUT;
  191. }
  192. return 0;
  193. _error_locked:
  194. mutex_unlock(&data->comm_lock);
  195. data->timeout_cnt++;
  196. return status;
  197. }
  198. static inline int ssp_spi_sync_command(struct ssp_data *data,
  199. struct ssp_msg *msg)
  200. {
  201. return ssp_do_transfer(data, msg, NULL, 0);
  202. }
  203. static int ssp_spi_sync(struct ssp_data *data, struct ssp_msg *msg,
  204. int timeout)
  205. {
  206. DECLARE_COMPLETION_ONSTACK(done);
  207. if (WARN_ON(!msg->length))
  208. return -EPERM;
  209. return ssp_do_transfer(data, msg, &done, timeout);
  210. }
  211. static int ssp_handle_big_data(struct ssp_data *data, char *dataframe, int *idx)
  212. {
  213. /* mock-up, it will be changed with adding another sensor types */
  214. *idx += 8;
  215. return 0;
  216. }
  217. static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len)
  218. {
  219. int idx, sd;
  220. struct ssp_sensor_data *spd;
  221. struct iio_dev **indio_devs = data->sensor_devs;
  222. for (idx = 0; idx < len;) {
  223. switch (dataframe[idx++]) {
  224. case SSP_MSG2AP_INST_BYPASS_DATA:
  225. if (idx >= len)
  226. return -EPROTO;
  227. sd = dataframe[idx++];
  228. if (sd < 0 || sd >= SSP_SENSOR_MAX) {
  229. dev_err(SSP_DEV,
  230. "Mcu data frame1 error %d\n", sd);
  231. return -EPROTO;
  232. }
  233. if (indio_devs[sd]) {
  234. spd = iio_priv(indio_devs[sd]);
  235. if (spd->process_data) {
  236. if (idx >= len)
  237. return -EPROTO;
  238. spd->process_data(indio_devs[sd],
  239. &dataframe[idx],
  240. data->timestamp);
  241. }
  242. } else {
  243. dev_err(SSP_DEV, "no client for frame\n");
  244. }
  245. idx += ssp_offset_map[sd];
  246. break;
  247. case SSP_MSG2AP_INST_DEBUG_DATA:
  248. if (idx >= len)
  249. return -EPROTO;
  250. sd = ssp_print_mcu_debug(dataframe, &idx, len);
  251. if (sd) {
  252. dev_err(SSP_DEV,
  253. "Mcu data frame3 error %d\n", sd);
  254. return sd;
  255. }
  256. break;
  257. case SSP_MSG2AP_INST_LIBRARY_DATA:
  258. idx += len;
  259. break;
  260. case SSP_MSG2AP_INST_BIG_DATA:
  261. ssp_handle_big_data(data, dataframe, &idx);
  262. break;
  263. case SSP_MSG2AP_INST_TIME_SYNC:
  264. data->time_syncing = true;
  265. break;
  266. case SSP_MSG2AP_INST_RESET:
  267. ssp_queue_ssp_refresh_task(data, 0);
  268. break;
  269. }
  270. }
  271. if (data->time_syncing)
  272. data->timestamp = ktime_get_real_ns();
  273. return 0;
  274. }
  275. /* threaded irq */
  276. int ssp_irq_msg(struct ssp_data *data)
  277. {
  278. char *buffer;
  279. u8 msg_type;
  280. int ret;
  281. u16 length, msg_options;
  282. struct ssp_msg *msg = NULL, *iter, *n;
  283. ret = spi_read(data->spi, data->header_buffer, SSP_HEADER_BUFFER_SIZE);
  284. if (ret < 0) {
  285. dev_err(SSP_DEV, "header read fail\n");
  286. return ret;
  287. }
  288. length = le16_to_cpu(data->header_buffer[1]);
  289. msg_options = le16_to_cpu(data->header_buffer[0]);
  290. if (length == 0) {
  291. dev_err(SSP_DEV, "length received from mcu is 0\n");
  292. return -EINVAL;
  293. }
  294. msg_type = SSP_GET_MESSAGE_TYPE(msg_options);
  295. switch (msg_type) {
  296. case SSP_AP2HUB_READ:
  297. case SSP_AP2HUB_WRITE:
  298. /*
  299. * this is a small list, a few elements - the packets can be
  300. * received with no order
  301. */
  302. mutex_lock(&data->pending_lock);
  303. list_for_each_entry_safe(iter, n, &data->pending_list, list) {
  304. if (iter->options == msg_options) {
  305. list_del(&iter->list);
  306. msg = iter;
  307. break;
  308. }
  309. }
  310. if (!msg) {
  311. /*
  312. * here can be implemented dead messages handling
  313. * but the slave should not send such ones - it is to
  314. * check but let's handle this
  315. */
  316. buffer = kmalloc(length, GFP_KERNEL | GFP_DMA);
  317. if (!buffer) {
  318. ret = -ENOMEM;
  319. goto _unlock;
  320. }
  321. /* got dead packet so it is always an error */
  322. ret = spi_read(data->spi, buffer, length);
  323. if (ret >= 0)
  324. ret = -EPROTO;
  325. kfree(buffer);
  326. dev_err(SSP_DEV, "No match error %x\n",
  327. msg_options);
  328. goto _unlock;
  329. }
  330. if (msg_type == SSP_AP2HUB_READ)
  331. ret = spi_read(data->spi,
  332. &msg->buffer[SSP_HEADER_SIZE_ALIGNED],
  333. msg->length);
  334. if (msg_type == SSP_AP2HUB_WRITE) {
  335. ret = spi_write(data->spi,
  336. &msg->buffer[SSP_HEADER_SIZE_ALIGNED],
  337. msg->length);
  338. if (msg_options & SSP_AP2HUB_RETURN) {
  339. msg->options =
  340. SSP_AP2HUB_READ | SSP_AP2HUB_RETURN;
  341. msg->length = 1;
  342. list_add_tail(&msg->list, &data->pending_list);
  343. goto _unlock;
  344. }
  345. }
  346. if (msg->done)
  347. if (!completion_done(msg->done))
  348. complete(msg->done);
  349. _unlock:
  350. mutex_unlock(&data->pending_lock);
  351. break;
  352. case SSP_HUB2AP_WRITE:
  353. buffer = kzalloc(length, GFP_KERNEL | GFP_DMA);
  354. if (!buffer)
  355. return -ENOMEM;
  356. ret = spi_read(data->spi, buffer, length);
  357. if (ret < 0) {
  358. dev_err(SSP_DEV, "spi read fail\n");
  359. kfree(buffer);
  360. break;
  361. }
  362. ret = ssp_parse_dataframe(data, buffer, length);
  363. kfree(buffer);
  364. break;
  365. default:
  366. dev_err(SSP_DEV, "unknown msg type\n");
  367. return -EPROTO;
  368. }
  369. return ret;
  370. }
  371. void ssp_clean_pending_list(struct ssp_data *data)
  372. {
  373. struct ssp_msg *msg, *n;
  374. mutex_lock(&data->pending_lock);
  375. list_for_each_entry_safe(msg, n, &data->pending_list, list) {
  376. list_del(&msg->list);
  377. if (msg->done)
  378. if (!completion_done(msg->done))
  379. complete(msg->done);
  380. }
  381. mutex_unlock(&data->pending_lock);
  382. }
  383. int ssp_command(struct ssp_data *data, char command, int arg)
  384. {
  385. int ret;
  386. struct ssp_msg *msg;
  387. msg = ssp_create_msg(command, 0, SSP_AP2HUB_WRITE, arg);
  388. if (!msg)
  389. return -ENOMEM;
  390. ssp_dbg("%s - command 0x%x %d\n", __func__, command, arg);
  391. ret = ssp_spi_sync_command(data, msg);
  392. ssp_clean_msg(msg);
  393. return ret;
  394. }
  395. int ssp_send_instruction(struct ssp_data *data, u8 inst, u8 sensor_type,
  396. u8 *send_buf, u8 length)
  397. {
  398. int ret;
  399. struct ssp_msg *msg;
  400. if (data->fw_dl_state == SSP_FW_DL_STATE_DOWNLOADING) {
  401. dev_err(SSP_DEV, "%s - Skip Inst! DL state = %d\n",
  402. __func__, data->fw_dl_state);
  403. return -EBUSY;
  404. } else if (!(data->available_sensors & BIT(sensor_type)) &&
  405. (inst <= SSP_MSG2SSP_INST_CHANGE_DELAY)) {
  406. dev_err(SSP_DEV, "%s - Bypass Inst Skip! - %u\n",
  407. __func__, sensor_type);
  408. return -EIO; /* just fail */
  409. }
  410. msg = ssp_create_msg(inst, length + 2, SSP_AP2HUB_WRITE, 0);
  411. if (!msg)
  412. return -ENOMEM;
  413. ssp_fill_buffer(msg, 0, &sensor_type, 1);
  414. ssp_fill_buffer(msg, 1, send_buf, length);
  415. ssp_dbg("%s - Inst = 0x%x, Sensor Type = 0x%x, data = %u\n",
  416. __func__, inst, sensor_type, send_buf[1]);
  417. ret = ssp_spi_sync(data, msg, 1000);
  418. ssp_clean_msg(msg);
  419. return ret;
  420. }
  421. int ssp_get_chipid(struct ssp_data *data)
  422. {
  423. int ret;
  424. char buffer;
  425. struct ssp_msg *msg;
  426. msg = ssp_create_msg(SSP_MSG2SSP_AP_WHOAMI, 1, SSP_AP2HUB_READ, 0);
  427. if (!msg)
  428. return -ENOMEM;
  429. ret = ssp_spi_sync(data, msg, 1000);
  430. buffer = SSP_GET_BUFFER_AT_INDEX(msg, 0);
  431. ssp_clean_msg(msg);
  432. return ret < 0 ? ret : buffer;
  433. }
  434. int ssp_set_magnetic_matrix(struct ssp_data *data)
  435. {
  436. int ret;
  437. struct ssp_msg *msg;
  438. msg = ssp_create_msg(SSP_MSG2SSP_AP_SET_MAGNETIC_STATIC_MATRIX,
  439. data->sensorhub_info->mag_length, SSP_AP2HUB_WRITE,
  440. 0);
  441. if (!msg)
  442. return -ENOMEM;
  443. ssp_fill_buffer(msg, 0, data->sensorhub_info->mag_table,
  444. data->sensorhub_info->mag_length);
  445. ret = ssp_spi_sync(data, msg, 1000);
  446. ssp_clean_msg(msg);
  447. return ret;
  448. }
  449. unsigned int ssp_get_sensor_scanning_info(struct ssp_data *data)
  450. {
  451. int ret;
  452. __le32 result;
  453. u32 cpu_result = 0;
  454. struct ssp_msg *msg = ssp_create_msg(SSP_MSG2SSP_AP_SENSOR_SCANNING, 4,
  455. SSP_AP2HUB_READ, 0);
  456. if (!msg)
  457. return 0;
  458. ret = ssp_spi_sync(data, msg, 1000);
  459. if (ret < 0) {
  460. dev_err(SSP_DEV, "%s - spi read fail %d\n", __func__, ret);
  461. goto _exit;
  462. }
  463. ssp_get_buffer(msg, 0, &result, 4);
  464. cpu_result = le32_to_cpu(result);
  465. dev_info(SSP_DEV, "%s state: 0x%08x\n", __func__, cpu_result);
  466. _exit:
  467. ssp_clean_msg(msg);
  468. return cpu_result;
  469. }
  470. unsigned int ssp_get_firmware_rev(struct ssp_data *data)
  471. {
  472. int ret;
  473. __le32 result;
  474. struct ssp_msg *msg = ssp_create_msg(SSP_MSG2SSP_AP_FIRMWARE_REV, 4,
  475. SSP_AP2HUB_READ, 0);
  476. if (!msg)
  477. return SSP_INVALID_REVISION;
  478. ret = ssp_spi_sync(data, msg, 1000);
  479. if (ret < 0) {
  480. dev_err(SSP_DEV, "%s - transfer fail %d\n", __func__, ret);
  481. ret = SSP_INVALID_REVISION;
  482. goto _exit;
  483. }
  484. ssp_get_buffer(msg, 0, &result, 4);
  485. ret = le32_to_cpu(result);
  486. _exit:
  487. ssp_clean_msg(msg);
  488. return ret;
  489. }