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