]> Git Repo - linux.git/blob - drivers/nfc/st95hf/core.c
ASoC: SOF: ipc3: Implement rx_msg IPC ops
[linux.git] / drivers / nfc / st95hf / core.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * --------------------------------------------------------------------
4  * Driver for ST NFC Transceiver ST95HF
5  * --------------------------------------------------------------------
6  * Copyright (C) 2015 STMicroelectronics Pvt. Ltd. All rights reserved.
7  */
8
9 #include <linux/err.h>
10 #include <linux/gpio.h>
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
13 #include <linux/irq.h>
14 #include <linux/module.h>
15 #include <linux/netdevice.h>
16 #include <linux/nfc.h>
17 #include <linux/of_gpio.h>
18 #include <linux/of.h>
19 #include <linux/property.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/wait.h>
22 #include <net/nfc/digital.h>
23 #include <net/nfc/nfc.h>
24
25 #include "spi.h"
26
27 /* supported protocols */
28 #define ST95HF_SUPPORTED_PROT           (NFC_PROTO_ISO14443_MASK | \
29                                         NFC_PROTO_ISO14443_B_MASK | \
30                                         NFC_PROTO_ISO15693_MASK)
31 /* driver capabilities */
32 #define ST95HF_CAPABILITIES             NFC_DIGITAL_DRV_CAPS_IN_CRC
33
34 /* Command Send Interface */
35 /* ST95HF_COMMAND_SEND CMD Ids */
36 #define ECHO_CMD                        0x55
37 #define WRITE_REGISTER_CMD              0x9
38 #define PROTOCOL_SELECT_CMD             0x2
39 #define SEND_RECEIVE_CMD                0x4
40
41 /* Select protocol codes */
42 #define ISO15693_PROTOCOL_CODE          0x1
43 #define ISO14443A_PROTOCOL_CODE         0x2
44 #define ISO14443B_PROTOCOL_CODE         0x3
45
46 /*
47  * head room len is 3
48  * 1 byte for control byte
49  * 1 byte for cmd
50  * 1 byte for size
51  */
52 #define ST95HF_HEADROOM_LEN             3
53
54 /*
55  * tailroom is 1 for ISO14443A
56  * and 0 for ISO14443B/ISO15693,
57  * hence the max value 1 should be
58  * taken.
59  */
60 #define ST95HF_TAILROOM_LEN             1
61
62 /* Command Response interface */
63 #define MAX_RESPONSE_BUFFER_SIZE        280
64 #define ECHORESPONSE                    0x55
65 #define ST95HF_ERR_MASK                 0xF
66 #define ST95HF_TIMEOUT_ERROR            0x87
67 #define ST95HF_NFCA_CRC_ERR_MASK        0x20
68 #define ST95HF_NFCB_CRC_ERR_MASK        0x01
69
70 /* ST95HF transmission flag values */
71 #define TRFLAG_NFCA_SHORT_FRAME         0x07
72 #define TRFLAG_NFCA_STD_FRAME           0x08
73 #define TRFLAG_NFCA_STD_FRAME_CRC       0x28
74
75 /* Misc defs */
76 #define HIGH                            1
77 #define LOW                             0
78 #define ISO14443A_RATS_REQ              0xE0
79 #define RATS_TB1_PRESENT_MASK           0x20
80 #define RATS_TA1_PRESENT_MASK           0x10
81 #define TB1_FWI_MASK                    0xF0
82 #define WTX_REQ_FROM_TAG                0xF2
83
84 #define MAX_CMD_LEN                     0x7
85
86 #define MAX_CMD_PARAMS                  4
87 struct cmd {
88         int cmd_len;
89         unsigned char cmd_id;
90         unsigned char no_cmd_params;
91         unsigned char cmd_params[MAX_CMD_PARAMS];
92         enum req_type req;
93 };
94
95 struct param_list {
96         int param_offset;
97         int new_param_val;
98 };
99
100 /*
101  * List of top-level cmds to be used internally by the driver.
102  * All these commands are build on top of ST95HF basic commands
103  * such as SEND_RECEIVE_CMD, PROTOCOL_SELECT_CMD, etc.
104  * These top level cmds are used internally while implementing various ops of
105  * digital layer/driver probe or extending the digital framework layer for
106  * features that are not yet implemented there, for example, WTX cmd handling.
107  */
108 enum st95hf_cmd_list {
109         CMD_ECHO,
110         CMD_ISO14443A_CONFIG,
111         CMD_ISO14443A_DEMOGAIN,
112         CMD_ISO14443B_DEMOGAIN,
113         CMD_ISO14443A_PROTOCOL_SELECT,
114         CMD_ISO14443B_PROTOCOL_SELECT,
115         CMD_WTX_RESPONSE,
116         CMD_FIELD_OFF,
117         CMD_ISO15693_PROTOCOL_SELECT,
118 };
119
120 static const struct cmd cmd_array[] = {
121         [CMD_ECHO] = {
122                 .cmd_len = 0x2,
123                 .cmd_id = ECHO_CMD,
124                 .no_cmd_params = 0,
125                 .req = SYNC,
126         },
127         [CMD_ISO14443A_CONFIG] = {
128                 .cmd_len = 0x7,
129                 .cmd_id = WRITE_REGISTER_CMD,
130                 .no_cmd_params = 0x4,
131                 .cmd_params = {0x3A, 0x00, 0x5A, 0x04},
132                 .req = SYNC,
133         },
134         [CMD_ISO14443A_DEMOGAIN] = {
135                 .cmd_len = 0x7,
136                 .cmd_id = WRITE_REGISTER_CMD,
137                 .no_cmd_params = 0x4,
138                 .cmd_params = {0x68, 0x01, 0x01, 0xDF},
139                 .req = SYNC,
140         },
141         [CMD_ISO14443B_DEMOGAIN] = {
142                 .cmd_len = 0x7,
143                 .cmd_id = WRITE_REGISTER_CMD,
144                 .no_cmd_params = 0x4,
145                 .cmd_params = {0x68, 0x01, 0x01, 0x51},
146                 .req = SYNC,
147         },
148         [CMD_ISO14443A_PROTOCOL_SELECT] = {
149                 .cmd_len = 0x7,
150                 .cmd_id = PROTOCOL_SELECT_CMD,
151                 .no_cmd_params = 0x4,
152                 .cmd_params = {ISO14443A_PROTOCOL_CODE, 0x00, 0x01, 0xA0},
153                 .req = SYNC,
154         },
155         [CMD_ISO14443B_PROTOCOL_SELECT] = {
156                 .cmd_len = 0x7,
157                 .cmd_id = PROTOCOL_SELECT_CMD,
158                 .no_cmd_params = 0x4,
159                 .cmd_params = {ISO14443B_PROTOCOL_CODE, 0x01, 0x03, 0xFF},
160                 .req = SYNC,
161         },
162         [CMD_WTX_RESPONSE] = {
163                 .cmd_len = 0x6,
164                 .cmd_id = SEND_RECEIVE_CMD,
165                 .no_cmd_params = 0x3,
166                 .cmd_params = {0xF2, 0x00, TRFLAG_NFCA_STD_FRAME_CRC},
167                 .req = ASYNC,
168         },
169         [CMD_FIELD_OFF] = {
170                 .cmd_len = 0x5,
171                 .cmd_id = PROTOCOL_SELECT_CMD,
172                 .no_cmd_params = 0x2,
173                 .cmd_params = {0x0, 0x0},
174                 .req = SYNC,
175         },
176         [CMD_ISO15693_PROTOCOL_SELECT] = {
177                 .cmd_len = 0x5,
178                 .cmd_id = PROTOCOL_SELECT_CMD,
179                 .no_cmd_params = 0x2,
180                 .cmd_params = {ISO15693_PROTOCOL_CODE, 0x0D},
181                 .req = SYNC,
182         },
183 };
184
185 /* st95_digital_cmd_complete_arg stores client context */
186 struct st95_digital_cmd_complete_arg {
187         struct sk_buff *skb_resp;
188         nfc_digital_cmd_complete_t complete_cb;
189         void *cb_usrarg;
190         bool rats;
191 };
192
193 /*
194  * structure containing ST95HF driver specific data.
195  * @spicontext: structure containing information required
196  *      for spi communication between st95hf and host.
197  * @ddev: nfc digital device object.
198  * @nfcdev: nfc device object.
199  * @enable_gpio: gpio used to enable st95hf transceiver.
200  * @complete_cb_arg: structure to store various context information
201  *      that is passed from nfc requesting thread to the threaded ISR.
202  * @st95hf_supply: regulator "consumer" for NFC device.
203  * @sendrcv_trflag: last byte of frame send by sendrecv command
204  *      of st95hf. This byte contains transmission flag info.
205  * @exchange_lock: semaphore used for signaling the st95hf_remove
206  *      function that the last outstanding async nfc request is finished.
207  * @rm_lock: mutex for ensuring safe access of nfc digital object
208  *      from threaded ISR. Usage of this mutex avoids any race between
209  *      deletion of the object from st95hf_remove() and its access from
210  *      the threaded ISR.
211  * @nfcdev_free: flag to have the state of nfc device object.
212  *      [alive | died]
213  * @current_protocol: current nfc protocol.
214  * @current_rf_tech: current rf technology.
215  * @fwi: frame waiting index, received in reply of RATS according to
216  *      digital protocol.
217  */
218 struct st95hf_context {
219         struct st95hf_spi_context spicontext;
220         struct nfc_digital_dev *ddev;
221         struct nfc_dev *nfcdev;
222         unsigned int enable_gpio;
223         struct st95_digital_cmd_complete_arg complete_cb_arg;
224         struct regulator *st95hf_supply;
225         unsigned char sendrcv_trflag;
226         struct semaphore exchange_lock;
227         struct mutex rm_lock;
228         bool nfcdev_free;
229         u8 current_protocol;
230         u8 current_rf_tech;
231         int fwi;
232 };
233
234 /*
235  * st95hf_send_recv_cmd() is for sending commands to ST95HF
236  * that are described in the cmd_array[]. It can optionally
237  * receive the response if the cmd request is of type
238  * SYNC. For that to happen caller must pass true to recv_res.
239  * For ASYNC request, recv_res is ignored and the
240  * function will never try to receive the response on behalf
241  * of the caller.
242  */
243 static int st95hf_send_recv_cmd(struct st95hf_context *st95context,
244                                 enum st95hf_cmd_list cmd,
245                                 int no_modif,
246                                 struct param_list *list_array,
247                                 bool recv_res)
248 {
249         unsigned char spi_cmd_buffer[MAX_CMD_LEN];
250         int i, ret;
251         struct device *dev = &st95context->spicontext.spidev->dev;
252
253         if (cmd_array[cmd].cmd_len > MAX_CMD_LEN)
254                 return -EINVAL;
255         if (cmd_array[cmd].no_cmd_params < no_modif)
256                 return -EINVAL;
257         if (no_modif && !list_array)
258                 return -EINVAL;
259
260         spi_cmd_buffer[0] = ST95HF_COMMAND_SEND;
261         spi_cmd_buffer[1] = cmd_array[cmd].cmd_id;
262         spi_cmd_buffer[2] = cmd_array[cmd].no_cmd_params;
263
264         memcpy(&spi_cmd_buffer[3], cmd_array[cmd].cmd_params,
265                spi_cmd_buffer[2]);
266
267         for (i = 0; i < no_modif; i++) {
268                 if (list_array[i].param_offset >= cmd_array[cmd].no_cmd_params)
269                         return -EINVAL;
270                 spi_cmd_buffer[3 + list_array[i].param_offset] =
271                                                 list_array[i].new_param_val;
272         }
273
274         ret = st95hf_spi_send(&st95context->spicontext,
275                               spi_cmd_buffer,
276                               cmd_array[cmd].cmd_len,
277                               cmd_array[cmd].req);
278         if (ret) {
279                 dev_err(dev, "st95hf_spi_send failed with error %d\n", ret);
280                 return ret;
281         }
282
283         if (cmd_array[cmd].req == SYNC && recv_res) {
284                 unsigned char st95hf_response_arr[2];
285
286                 ret = st95hf_spi_recv_response(&st95context->spicontext,
287                                                st95hf_response_arr);
288                 if (ret < 0) {
289                         dev_err(dev, "spi error from st95hf_spi_recv_response(), err = 0x%x\n",
290                                 ret);
291                         return ret;
292                 }
293
294                 if (st95hf_response_arr[0]) {
295                         dev_err(dev, "st95hf error from st95hf_spi_recv_response(), err = 0x%x\n",
296                                 st95hf_response_arr[0]);
297                         return -EIO;
298                 }
299         }
300
301         return 0;
302 }
303
304 static int st95hf_echo_command(struct st95hf_context *st95context)
305 {
306         int result = 0;
307         unsigned char echo_response;
308
309         result = st95hf_send_recv_cmd(st95context, CMD_ECHO, 0, NULL, false);
310         if (result)
311                 return result;
312
313         /* If control reached here, response can be taken */
314         result = st95hf_spi_recv_echo_res(&st95context->spicontext,
315                                           &echo_response);
316         if (result) {
317                 dev_err(&st95context->spicontext.spidev->dev,
318                         "err: echo response receive error = 0x%x\n", result);
319                 return result;
320         }
321
322         if (echo_response == ECHORESPONSE)
323                 return 0;
324
325         dev_err(&st95context->spicontext.spidev->dev, "err: echo res is 0x%x\n",
326                 echo_response);
327
328         return -EIO;
329 }
330
331 static int secondary_configuration_type4a(struct st95hf_context *stcontext)
332 {
333         int result = 0;
334         struct device *dev = &stcontext->nfcdev->dev;
335
336         /* 14443A config setting after select protocol */
337         result = st95hf_send_recv_cmd(stcontext,
338                                       CMD_ISO14443A_CONFIG,
339                                       0,
340                                       NULL,
341                                       true);
342         if (result) {
343                 dev_err(dev, "type a config cmd, err = 0x%x\n", result);
344                 return result;
345         }
346
347         /* 14443A demo gain setting */
348         result = st95hf_send_recv_cmd(stcontext,
349                                       CMD_ISO14443A_DEMOGAIN,
350                                       0,
351                                       NULL,
352                                       true);
353         if (result)
354                 dev_err(dev, "type a demogain cmd, err = 0x%x\n", result);
355
356         return result;
357 }
358
359 static int secondary_configuration_type4b(struct st95hf_context *stcontext)
360 {
361         int result = 0;
362         struct device *dev = &stcontext->nfcdev->dev;
363
364         result = st95hf_send_recv_cmd(stcontext,
365                                       CMD_ISO14443B_DEMOGAIN,
366                                       0,
367                                       NULL,
368                                       true);
369         if (result)
370                 dev_err(dev, "type b demogain cmd, err = 0x%x\n", result);
371
372         return result;
373 }
374
375 static int st95hf_select_protocol(struct st95hf_context *stcontext, int type)
376 {
377         int result = 0;
378         struct device *dev;
379
380         dev = &stcontext->nfcdev->dev;
381
382         switch (type) {
383         case NFC_DIGITAL_RF_TECH_106A:
384                 stcontext->current_rf_tech = NFC_DIGITAL_RF_TECH_106A;
385                 result = st95hf_send_recv_cmd(stcontext,
386                                               CMD_ISO14443A_PROTOCOL_SELECT,
387                                               0,
388                                               NULL,
389                                               true);
390                 if (result) {
391                         dev_err(dev, "protocol sel, err = 0x%x\n",
392                                 result);
393                         return result;
394                 }
395
396                 /* secondary config. for 14443Type 4A after protocol select */
397                 result = secondary_configuration_type4a(stcontext);
398                 if (result) {
399                         dev_err(dev, "type a secondary config, err = 0x%x\n",
400                                 result);
401                         return result;
402                 }
403                 break;
404         case NFC_DIGITAL_RF_TECH_106B:
405                 stcontext->current_rf_tech = NFC_DIGITAL_RF_TECH_106B;
406                 result = st95hf_send_recv_cmd(stcontext,
407                                               CMD_ISO14443B_PROTOCOL_SELECT,
408                                               0,
409                                               NULL,
410                                               true);
411                 if (result) {
412                         dev_err(dev, "protocol sel send, err = 0x%x\n",
413                                 result);
414                         return result;
415                 }
416
417                 /*
418                  * delay of 5-6 ms is required after select protocol
419                  * command in case of ISO14443 Type B
420                  */
421                 usleep_range(50000, 60000);
422
423                 /* secondary config. for 14443Type 4B after protocol select */
424                 result = secondary_configuration_type4b(stcontext);
425                 if (result) {
426                         dev_err(dev, "type b secondary config, err = 0x%x\n",
427                                 result);
428                         return result;
429                 }
430                 break;
431         case NFC_DIGITAL_RF_TECH_ISO15693:
432                 stcontext->current_rf_tech = NFC_DIGITAL_RF_TECH_ISO15693;
433                 result = st95hf_send_recv_cmd(stcontext,
434                                               CMD_ISO15693_PROTOCOL_SELECT,
435                                               0,
436                                               NULL,
437                                               true);
438                 if (result) {
439                         dev_err(dev, "protocol sel send, err = 0x%x\n",
440                                 result);
441                         return result;
442                 }
443                 break;
444         default:
445                 return -EINVAL;
446         }
447
448         return 0;
449 }
450
451 static void st95hf_send_st95enable_negativepulse(struct st95hf_context *st95con)
452 {
453         /* First make irq_in pin high */
454         gpio_set_value(st95con->enable_gpio, HIGH);
455
456         /* wait for 1 milisecond */
457         usleep_range(1000, 2000);
458
459         /* Make irq_in pin low */
460         gpio_set_value(st95con->enable_gpio, LOW);
461
462         /* wait for minimum interrupt pulse to make st95 active */
463         usleep_range(1000, 2000);
464
465         /* At end make it high */
466         gpio_set_value(st95con->enable_gpio, HIGH);
467 }
468
469 /*
470  * Send a reset sequence over SPI bus (Reset command + wait 3ms +
471  * negative pulse on st95hf enable gpio
472  */
473 static int st95hf_send_spi_reset_sequence(struct st95hf_context *st95context)
474 {
475         int result = 0;
476         unsigned char reset_cmd = ST95HF_COMMAND_RESET;
477
478         result = st95hf_spi_send(&st95context->spicontext,
479                                  &reset_cmd,
480                                  ST95HF_RESET_CMD_LEN,
481                                  ASYNC);
482         if (result) {
483                 dev_err(&st95context->spicontext.spidev->dev,
484                         "spi reset sequence cmd error = %d", result);
485                 return result;
486         }
487
488         /* wait for 3 milisecond to complete the controller reset process */
489         usleep_range(3000, 4000);
490
491         /* send negative pulse to make st95hf active */
492         st95hf_send_st95enable_negativepulse(st95context);
493
494         /* wait for 10 milisecond : HFO setup time */
495         usleep_range(10000, 20000);
496
497         return result;
498 }
499
500 static int st95hf_por_sequence(struct st95hf_context *st95context)
501 {
502         int nth_attempt = 1;
503         int result;
504
505         st95hf_send_st95enable_negativepulse(st95context);
506
507         usleep_range(5000, 6000);
508         do {
509                 /* send an ECHO command and checks ST95HF response */
510                 result = st95hf_echo_command(st95context);
511
512                 dev_dbg(&st95context->spicontext.spidev->dev,
513                         "response from echo function = 0x%x, attempt = %d\n",
514                         result, nth_attempt);
515
516                 if (!result)
517                         return 0;
518
519                 /* send an pulse on IRQ in case of the chip is on sleep state */
520                 if (nth_attempt == 2)
521                         st95hf_send_st95enable_negativepulse(st95context);
522                 else
523                         st95hf_send_spi_reset_sequence(st95context);
524
525                 /* delay of 50 milisecond */
526                 usleep_range(50000, 51000);
527         } while (nth_attempt++ < 3);
528
529         return -ETIMEDOUT;
530 }
531
532 static int iso14443_config_fdt(struct st95hf_context *st95context, int wtxm)
533 {
534         int result = 0;
535         struct device *dev = &st95context->spicontext.spidev->dev;
536         struct nfc_digital_dev *nfcddev = st95context->ddev;
537         unsigned char pp_typeb;
538         struct param_list new_params[2];
539
540         pp_typeb = cmd_array[CMD_ISO14443B_PROTOCOL_SELECT].cmd_params[2];
541
542         if (nfcddev->curr_protocol == NFC_PROTO_ISO14443 &&
543             st95context->fwi < 4)
544                 st95context->fwi = 4;
545
546         new_params[0].param_offset = 2;
547         if (nfcddev->curr_protocol == NFC_PROTO_ISO14443)
548                 new_params[0].new_param_val = st95context->fwi;
549         else if (nfcddev->curr_protocol == NFC_PROTO_ISO14443_B)
550                 new_params[0].new_param_val = pp_typeb;
551
552         new_params[1].param_offset = 3;
553         new_params[1].new_param_val = wtxm;
554
555         switch (nfcddev->curr_protocol) {
556         case NFC_PROTO_ISO14443:
557                 result = st95hf_send_recv_cmd(st95context,
558                                               CMD_ISO14443A_PROTOCOL_SELECT,
559                                               2,
560                                               new_params,
561                                               true);
562                 if (result) {
563                         dev_err(dev, "WTX type a sel proto, err = 0x%x\n",
564                                 result);
565                         return result;
566                 }
567
568                 /* secondary config. for 14443Type 4A after protocol select */
569                 result = secondary_configuration_type4a(st95context);
570                 if (result) {
571                         dev_err(dev, "WTX type a second. config, err = 0x%x\n",
572                                 result);
573                         return result;
574                 }
575                 break;
576         case NFC_PROTO_ISO14443_B:
577                 result = st95hf_send_recv_cmd(st95context,
578                                               CMD_ISO14443B_PROTOCOL_SELECT,
579                                               2,
580                                               new_params,
581                                               true);
582                 if (result) {
583                         dev_err(dev, "WTX type b sel proto, err = 0x%x\n",
584                                 result);
585                         return result;
586                 }
587
588                 /* secondary config. for 14443Type 4B after protocol select */
589                 result = secondary_configuration_type4b(st95context);
590                 if (result) {
591                         dev_err(dev, "WTX type b second. config, err = 0x%x\n",
592                                 result);
593                         return result;
594                 }
595                 break;
596         default:
597                 return -EINVAL;
598         }
599
600         return 0;
601 }
602
603 static int st95hf_handle_wtx(struct st95hf_context *stcontext,
604                              bool new_wtx,
605                              int wtx_val)
606 {
607         int result = 0;
608         unsigned char val_mm = 0;
609         struct param_list new_params[1];
610         struct nfc_digital_dev *nfcddev = stcontext->ddev;
611         struct device *dev = &stcontext->nfcdev->dev;
612
613         if (new_wtx) {
614                 result = iso14443_config_fdt(stcontext, wtx_val & 0x3f);
615                 if (result) {
616                         dev_err(dev, "Config. setting error on WTX req, err = 0x%x\n",
617                                 result);
618                         return result;
619                 }
620
621                 /* Send response of wtx with ASYNC as no response expected */
622                 new_params[0].param_offset = 1;
623                 new_params[0].new_param_val = wtx_val;
624
625                 result = st95hf_send_recv_cmd(stcontext,
626                                               CMD_WTX_RESPONSE,
627                                               1,
628                                               new_params,
629                                               false);
630                 if (result)
631                         dev_err(dev, "WTX response send, err = 0x%x\n", result);
632                 return result;
633         }
634
635         /* if no new wtx, cofigure with default values */
636         if (nfcddev->curr_protocol == NFC_PROTO_ISO14443)
637                 val_mm = cmd_array[CMD_ISO14443A_PROTOCOL_SELECT].cmd_params[3];
638         else if (nfcddev->curr_protocol == NFC_PROTO_ISO14443_B)
639                 val_mm = cmd_array[CMD_ISO14443B_PROTOCOL_SELECT].cmd_params[3];
640
641         result = iso14443_config_fdt(stcontext, val_mm);
642         if (result)
643                 dev_err(dev, "Default config. setting error after WTX processing, err = 0x%x\n",
644                         result);
645
646         return result;
647 }
648
649 static int st95hf_error_handling(struct st95hf_context *stcontext,
650                                  struct sk_buff *skb_resp,
651                                  int res_len)
652 {
653         int result = 0;
654         unsigned char error_byte;
655         struct device *dev = &stcontext->nfcdev->dev;
656
657         /* First check ST95HF specific error */
658         if (skb_resp->data[0] & ST95HF_ERR_MASK) {
659                 if (skb_resp->data[0] == ST95HF_TIMEOUT_ERROR)
660                         result = -ETIMEDOUT;
661                 else
662                         result = -EIO;
663                 return result;
664         }
665
666         /* Check for CRC err only if CRC is present in the tag response */
667         switch (stcontext->current_rf_tech) {
668         case NFC_DIGITAL_RF_TECH_106A:
669                 if (stcontext->sendrcv_trflag == TRFLAG_NFCA_STD_FRAME_CRC) {
670                         error_byte = skb_resp->data[res_len - 3];
671                         if (error_byte & ST95HF_NFCA_CRC_ERR_MASK) {
672                                 /* CRC error occurred */
673                                 dev_err(dev, "CRC error, byte received = 0x%x\n",
674                                         error_byte);
675                                 result = -EIO;
676                         }
677                 }
678                 break;
679         case NFC_DIGITAL_RF_TECH_106B:
680         case NFC_DIGITAL_RF_TECH_ISO15693:
681                 error_byte = skb_resp->data[res_len - 1];
682                 if (error_byte & ST95HF_NFCB_CRC_ERR_MASK) {
683                         /* CRC error occurred */
684                         dev_err(dev, "CRC error, byte received = 0x%x\n",
685                                 error_byte);
686                         result = -EIO;
687                 }
688                 break;
689         }
690
691         return result;
692 }
693
694 static int st95hf_response_handler(struct st95hf_context *stcontext,
695                                    struct sk_buff *skb_resp,
696                                    int res_len)
697 {
698         int result = 0;
699         int skb_len;
700         unsigned char val_mm;
701         struct nfc_digital_dev *nfcddev = stcontext->ddev;
702         struct device *dev = &stcontext->nfcdev->dev;
703         struct st95_digital_cmd_complete_arg *cb_arg;
704
705         cb_arg = &stcontext->complete_cb_arg;
706
707         /* Process the response */
708         skb_put(skb_resp, res_len);
709
710         /* Remove st95 header */
711         skb_pull(skb_resp, 2);
712
713         skb_len = skb_resp->len;
714
715         /* check if it is case of RATS request reply & FWI is present */
716         if (nfcddev->curr_protocol == NFC_PROTO_ISO14443 && cb_arg->rats &&
717             (skb_resp->data[1] & RATS_TB1_PRESENT_MASK)) {
718                 if (skb_resp->data[1] & RATS_TA1_PRESENT_MASK)
719                         stcontext->fwi =
720                                 (skb_resp->data[3] & TB1_FWI_MASK) >> 4;
721                 else
722                         stcontext->fwi =
723                                 (skb_resp->data[2] & TB1_FWI_MASK) >> 4;
724
725                 val_mm = cmd_array[CMD_ISO14443A_PROTOCOL_SELECT].cmd_params[3];
726
727                 result = iso14443_config_fdt(stcontext, val_mm);
728                 if (result) {
729                         dev_err(dev, "error in config_fdt to handle fwi of ATS, error=%d\n",
730                                 result);
731                         return result;
732                 }
733         }
734         cb_arg->rats = false;
735
736         /* Remove CRC bytes only if received frames data has an eod (CRC) */
737         switch (stcontext->current_rf_tech) {
738         case NFC_DIGITAL_RF_TECH_106A:
739                 if (stcontext->sendrcv_trflag == TRFLAG_NFCA_STD_FRAME_CRC)
740                         skb_trim(skb_resp, (skb_len - 5));
741                 else
742                         skb_trim(skb_resp, (skb_len - 3));
743                 break;
744         case NFC_DIGITAL_RF_TECH_106B:
745         case NFC_DIGITAL_RF_TECH_ISO15693:
746                 skb_trim(skb_resp, (skb_len - 3));
747                 break;
748         }
749
750         return result;
751 }
752
753 static irqreturn_t st95hf_irq_handler(int irq, void  *st95hfcontext)
754 {
755         struct st95hf_context *stcontext  =
756                 (struct st95hf_context *)st95hfcontext;
757
758         if (stcontext->spicontext.req_issync) {
759                 complete(&stcontext->spicontext.done);
760                 stcontext->spicontext.req_issync = false;
761                 return IRQ_HANDLED;
762         }
763
764         return IRQ_WAKE_THREAD;
765 }
766
767 static irqreturn_t st95hf_irq_thread_handler(int irq, void  *st95hfcontext)
768 {
769         int result = 0;
770         int res_len;
771         static bool wtx;
772         struct device *spidevice;
773         struct sk_buff *skb_resp;
774         struct st95hf_context *stcontext  =
775                 (struct st95hf_context *)st95hfcontext;
776         struct st95_digital_cmd_complete_arg *cb_arg;
777
778         spidevice = &stcontext->spicontext.spidev->dev;
779
780         /*
781          * check semaphore, if not down() already, then we don't
782          * know in which context the ISR is called and surely it
783          * will be a bug. Note that down() of the semaphore is done
784          * in the corresponding st95hf_in_send_cmd() and then
785          * only this ISR should be called. ISR will up() the
786          * semaphore before leaving. Hence when the ISR is called
787          * the correct behaviour is down_trylock() should always
788          * return 1 (indicating semaphore cant be taken and hence no
789          * change in semaphore count).
790          * If not, then we up() the semaphore and crash on
791          * a BUG() !
792          */
793         if (!down_trylock(&stcontext->exchange_lock)) {
794                 up(&stcontext->exchange_lock);
795                 WARN(1, "unknown context in ST95HF ISR");
796                 return IRQ_NONE;
797         }
798
799         cb_arg = &stcontext->complete_cb_arg;
800         skb_resp = cb_arg->skb_resp;
801
802         mutex_lock(&stcontext->rm_lock);
803         res_len = st95hf_spi_recv_response(&stcontext->spicontext,
804                                            skb_resp->data);
805         if (res_len < 0) {
806                 dev_err(spidevice, "TISR spi response err = 0x%x\n", res_len);
807                 result = res_len;
808                 goto end;
809         }
810
811         /* if stcontext->nfcdev_free is true, it means remove already ran */
812         if (stcontext->nfcdev_free) {
813                 result = -ENODEV;
814                 goto end;
815         }
816
817         if (skb_resp->data[2] == WTX_REQ_FROM_TAG) {
818                 /* Request for new FWT from tag */
819                 result = st95hf_handle_wtx(stcontext, true, skb_resp->data[3]);
820                 if (result)
821                         goto end;
822
823                 wtx = true;
824                 mutex_unlock(&stcontext->rm_lock);
825                 return IRQ_HANDLED;
826         }
827
828         result = st95hf_error_handling(stcontext, skb_resp, res_len);
829         if (result)
830                 goto end;
831
832         result = st95hf_response_handler(stcontext, skb_resp, res_len);
833         if (result)
834                 goto end;
835
836         /*
837          * If select protocol is done on wtx req. do select protocol
838          * again with default values
839          */
840         if (wtx) {
841                 wtx = false;
842                 result = st95hf_handle_wtx(stcontext, false, 0);
843                 if (result)
844                         goto end;
845         }
846
847         /* call digital layer callback */
848         cb_arg->complete_cb(stcontext->ddev, cb_arg->cb_usrarg, skb_resp);
849
850         /* up the semaphore before returning */
851         up(&stcontext->exchange_lock);
852         mutex_unlock(&stcontext->rm_lock);
853
854         return IRQ_HANDLED;
855
856 end:
857         kfree_skb(skb_resp);
858         wtx = false;
859         cb_arg->rats = false;
860         skb_resp = ERR_PTR(result);
861         /* call of callback with error */
862         cb_arg->complete_cb(stcontext->ddev, cb_arg->cb_usrarg, skb_resp);
863         /* up the semaphore before returning */
864         up(&stcontext->exchange_lock);
865         mutex_unlock(&stcontext->rm_lock);
866         return IRQ_HANDLED;
867 }
868
869 /* NFC ops functions definition */
870 static int st95hf_in_configure_hw(struct nfc_digital_dev *ddev,
871                                   int type,
872                                   int param)
873 {
874         struct st95hf_context *stcontext = nfc_digital_get_drvdata(ddev);
875
876         if (type == NFC_DIGITAL_CONFIG_RF_TECH)
877                 return st95hf_select_protocol(stcontext, param);
878
879         if (type == NFC_DIGITAL_CONFIG_FRAMING) {
880                 switch (param) {
881                 case NFC_DIGITAL_FRAMING_NFCA_SHORT:
882                         stcontext->sendrcv_trflag = TRFLAG_NFCA_SHORT_FRAME;
883                         break;
884                 case NFC_DIGITAL_FRAMING_NFCA_STANDARD:
885                         stcontext->sendrcv_trflag = TRFLAG_NFCA_STD_FRAME;
886                         break;
887                 case NFC_DIGITAL_FRAMING_NFCA_T4T:
888                 case NFC_DIGITAL_FRAMING_NFCA_NFC_DEP:
889                 case NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A:
890                         stcontext->sendrcv_trflag = TRFLAG_NFCA_STD_FRAME_CRC;
891                         break;
892                 case NFC_DIGITAL_FRAMING_NFCB:
893                 case NFC_DIGITAL_FRAMING_ISO15693_INVENTORY:
894                 case NFC_DIGITAL_FRAMING_ISO15693_T5T:
895                         break;
896                 }
897         }
898
899         return 0;
900 }
901
902 static int rf_off(struct st95hf_context *stcontext)
903 {
904         int rc;
905         struct device *dev;
906
907         dev = &stcontext->nfcdev->dev;
908
909         rc = st95hf_send_recv_cmd(stcontext, CMD_FIELD_OFF, 0, NULL, true);
910         if (rc)
911                 dev_err(dev, "protocol sel send field off, err = 0x%x\n", rc);
912
913         return rc;
914 }
915
916 static int st95hf_in_send_cmd(struct nfc_digital_dev *ddev,
917                               struct sk_buff *skb,
918                               u16 timeout,
919                               nfc_digital_cmd_complete_t cb,
920                               void *arg)
921 {
922         struct st95hf_context *stcontext = nfc_digital_get_drvdata(ddev);
923         int rc;
924         struct sk_buff *skb_resp;
925         int len_data_to_tag = 0;
926
927         skb_resp = nfc_alloc_recv_skb(MAX_RESPONSE_BUFFER_SIZE, GFP_KERNEL);
928         if (!skb_resp)
929                 return -ENOMEM;
930
931         switch (stcontext->current_rf_tech) {
932         case NFC_DIGITAL_RF_TECH_106A:
933                 len_data_to_tag = skb->len + 1;
934                 skb_put_u8(skb, stcontext->sendrcv_trflag);
935                 break;
936         case NFC_DIGITAL_RF_TECH_106B:
937         case NFC_DIGITAL_RF_TECH_ISO15693:
938                 len_data_to_tag = skb->len;
939                 break;
940         default:
941                 rc = -EINVAL;
942                 goto free_skb_resp;
943         }
944
945         skb_push(skb, 3);
946         skb->data[0] = ST95HF_COMMAND_SEND;
947         skb->data[1] = SEND_RECEIVE_CMD;
948         skb->data[2] = len_data_to_tag;
949
950         stcontext->complete_cb_arg.skb_resp = skb_resp;
951         stcontext->complete_cb_arg.cb_usrarg = arg;
952         stcontext->complete_cb_arg.complete_cb = cb;
953
954         if ((skb->data[3] == ISO14443A_RATS_REQ) &&
955             ddev->curr_protocol == NFC_PROTO_ISO14443)
956                 stcontext->complete_cb_arg.rats = true;
957
958         /*
959          * down the semaphore to indicate to remove func that an
960          * ISR is pending, note that it will not block here in any case.
961          * If found blocked, it is a BUG!
962          */
963         rc = down_killable(&stcontext->exchange_lock);
964         if (rc) {
965                 WARN(1, "Semaphore is not found up in st95hf_in_send_cmd\n");
966                 goto free_skb_resp;
967         }
968
969         rc = st95hf_spi_send(&stcontext->spicontext, skb->data,
970                              skb->len,
971                              ASYNC);
972         if (rc) {
973                 dev_err(&stcontext->nfcdev->dev,
974                         "Error %d trying to perform data_exchange", rc);
975                 /* up the semaphore since ISR will never come in this case */
976                 up(&stcontext->exchange_lock);
977                 goto free_skb_resp;
978         }
979
980         kfree_skb(skb);
981
982         return rc;
983
984 free_skb_resp:
985         kfree_skb(skb_resp);
986         return rc;
987 }
988
989 /* p2p will be supported in a later release ! */
990 static int st95hf_tg_configure_hw(struct nfc_digital_dev *ddev,
991                                   int type,
992                                   int param)
993 {
994         return 0;
995 }
996
997 static int st95hf_tg_send_cmd(struct nfc_digital_dev *ddev,
998                               struct sk_buff *skb,
999                               u16 timeout,
1000                               nfc_digital_cmd_complete_t cb,
1001                               void *arg)
1002 {
1003         return 0;
1004 }
1005
1006 static int st95hf_tg_listen(struct nfc_digital_dev *ddev,
1007                             u16 timeout,
1008                             nfc_digital_cmd_complete_t cb,
1009                             void *arg)
1010 {
1011         return 0;
1012 }
1013
1014 static int st95hf_tg_get_rf_tech(struct nfc_digital_dev *ddev, u8 *rf_tech)
1015 {
1016         return 0;
1017 }
1018
1019 static int st95hf_switch_rf(struct nfc_digital_dev *ddev, bool on)
1020 {
1021         u8 rf_tech;
1022         struct st95hf_context *stcontext = nfc_digital_get_drvdata(ddev);
1023
1024         rf_tech = ddev->curr_rf_tech;
1025
1026         if (on)
1027                 /* switch on RF field */
1028                 return st95hf_select_protocol(stcontext, rf_tech);
1029
1030         /* switch OFF RF field */
1031         return rf_off(stcontext);
1032 }
1033
1034 /* TODO st95hf_abort_cmd */
1035 static void st95hf_abort_cmd(struct nfc_digital_dev *ddev)
1036 {
1037 }
1038
1039 static const struct nfc_digital_ops st95hf_nfc_digital_ops = {
1040         .in_configure_hw = st95hf_in_configure_hw,
1041         .in_send_cmd = st95hf_in_send_cmd,
1042
1043         .tg_listen = st95hf_tg_listen,
1044         .tg_configure_hw = st95hf_tg_configure_hw,
1045         .tg_send_cmd = st95hf_tg_send_cmd,
1046         .tg_get_rf_tech = st95hf_tg_get_rf_tech,
1047
1048         .switch_rf = st95hf_switch_rf,
1049         .abort_cmd = st95hf_abort_cmd,
1050 };
1051
1052 static const struct spi_device_id st95hf_id[] = {
1053         { "st95hf", 0 },
1054         {}
1055 };
1056 MODULE_DEVICE_TABLE(spi, st95hf_id);
1057
1058 static const struct of_device_id st95hf_spi_of_match[] __maybe_unused = {
1059         { .compatible = "st,st95hf" },
1060         {},
1061 };
1062 MODULE_DEVICE_TABLE(of, st95hf_spi_of_match);
1063
1064 static int st95hf_probe(struct spi_device *nfc_spi_dev)
1065 {
1066         int ret;
1067
1068         struct st95hf_context *st95context;
1069         struct st95hf_spi_context *spicontext;
1070
1071         nfc_info(&nfc_spi_dev->dev, "ST95HF driver probe called.\n");
1072
1073         st95context = devm_kzalloc(&nfc_spi_dev->dev,
1074                                    sizeof(struct st95hf_context),
1075                                    GFP_KERNEL);
1076         if (!st95context)
1077                 return -ENOMEM;
1078
1079         spicontext = &st95context->spicontext;
1080
1081         spicontext->spidev = nfc_spi_dev;
1082
1083         st95context->fwi =
1084                 cmd_array[CMD_ISO14443A_PROTOCOL_SELECT].cmd_params[2];
1085
1086         if (device_property_present(&nfc_spi_dev->dev, "st95hfvin")) {
1087                 st95context->st95hf_supply =
1088                         devm_regulator_get(&nfc_spi_dev->dev,
1089                                            "st95hfvin");
1090                 if (IS_ERR(st95context->st95hf_supply)) {
1091                         dev_err(&nfc_spi_dev->dev, "failed to acquire regulator\n");
1092                         return PTR_ERR(st95context->st95hf_supply);
1093                 }
1094
1095                 ret = regulator_enable(st95context->st95hf_supply);
1096                 if (ret) {
1097                         dev_err(&nfc_spi_dev->dev, "failed to enable regulator\n");
1098                         return ret;
1099                 }
1100         }
1101
1102         init_completion(&spicontext->done);
1103         mutex_init(&spicontext->spi_lock);
1104
1105         /*
1106          * Store spicontext in spi device object for using it in
1107          * remove function
1108          */
1109         dev_set_drvdata(&nfc_spi_dev->dev, spicontext);
1110
1111         st95context->enable_gpio =
1112                 of_get_named_gpio(nfc_spi_dev->dev.of_node,
1113                                   "enable-gpio",
1114                                   0);
1115         if (!gpio_is_valid(st95context->enable_gpio)) {
1116                 dev_err(&nfc_spi_dev->dev, "No valid enable gpio\n");
1117                 ret = st95context->enable_gpio;
1118                 goto err_disable_regulator;
1119         }
1120
1121         ret = devm_gpio_request_one(&nfc_spi_dev->dev, st95context->enable_gpio,
1122                                     GPIOF_DIR_OUT | GPIOF_INIT_HIGH,
1123                                     "enable_gpio");
1124         if (ret)
1125                 goto err_disable_regulator;
1126
1127         if (nfc_spi_dev->irq > 0) {
1128                 if (devm_request_threaded_irq(&nfc_spi_dev->dev,
1129                                               nfc_spi_dev->irq,
1130                                               st95hf_irq_handler,
1131                                               st95hf_irq_thread_handler,
1132                                               IRQF_TRIGGER_FALLING,
1133                                               "st95hf",
1134                                               (void *)st95context) < 0) {
1135                         dev_err(&nfc_spi_dev->dev, "err: irq request for st95hf is failed\n");
1136                         ret =  -EINVAL;
1137                         goto err_disable_regulator;
1138                 }
1139         } else {
1140                 dev_err(&nfc_spi_dev->dev, "not a valid IRQ associated with ST95HF\n");
1141                 ret = -EINVAL;
1142                 goto err_disable_regulator;
1143         }
1144
1145         /*
1146          * First reset SPI to handle warm reset of the system.
1147          * It will put the ST95HF device in Power ON state
1148          * which make the state of device identical to state
1149          * at the time of cold reset of the system.
1150          */
1151         ret = st95hf_send_spi_reset_sequence(st95context);
1152         if (ret) {
1153                 dev_err(&nfc_spi_dev->dev, "err: spi_reset_sequence failed\n");
1154                 goto err_disable_regulator;
1155         }
1156
1157         /* call PowerOnReset sequence of ST95hf to activate it */
1158         ret = st95hf_por_sequence(st95context);
1159         if (ret) {
1160                 dev_err(&nfc_spi_dev->dev, "err: por seq failed for st95hf\n");
1161                 goto err_disable_regulator;
1162         }
1163
1164         /* create NFC dev object and register with NFC Subsystem */
1165         st95context->ddev = nfc_digital_allocate_device(&st95hf_nfc_digital_ops,
1166                                                         ST95HF_SUPPORTED_PROT,
1167                                                         ST95HF_CAPABILITIES,
1168                                                         ST95HF_HEADROOM_LEN,
1169                                                         ST95HF_TAILROOM_LEN);
1170         if (!st95context->ddev) {
1171                 ret = -ENOMEM;
1172                 goto err_disable_regulator;
1173         }
1174
1175         st95context->nfcdev = st95context->ddev->nfc_dev;
1176         nfc_digital_set_parent_dev(st95context->ddev, &nfc_spi_dev->dev);
1177
1178         ret =  nfc_digital_register_device(st95context->ddev);
1179         if (ret) {
1180                 dev_err(&st95context->nfcdev->dev, "st95hf registration failed\n");
1181                 goto err_free_digital_device;
1182         }
1183
1184         /* store st95context in nfc device object */
1185         nfc_digital_set_drvdata(st95context->ddev, st95context);
1186
1187         sema_init(&st95context->exchange_lock, 1);
1188         mutex_init(&st95context->rm_lock);
1189
1190         return ret;
1191
1192 err_free_digital_device:
1193         nfc_digital_free_device(st95context->ddev);
1194 err_disable_regulator:
1195         if (st95context->st95hf_supply)
1196                 regulator_disable(st95context->st95hf_supply);
1197
1198         return ret;
1199 }
1200
1201 static void st95hf_remove(struct spi_device *nfc_spi_dev)
1202 {
1203         int result = 0;
1204         unsigned char reset_cmd = ST95HF_COMMAND_RESET;
1205         struct st95hf_spi_context *spictx = dev_get_drvdata(&nfc_spi_dev->dev);
1206
1207         struct st95hf_context *stcontext = container_of(spictx,
1208                                                         struct st95hf_context,
1209                                                         spicontext);
1210
1211         mutex_lock(&stcontext->rm_lock);
1212
1213         nfc_digital_unregister_device(stcontext->ddev);
1214         nfc_digital_free_device(stcontext->ddev);
1215         stcontext->nfcdev_free = true;
1216
1217         mutex_unlock(&stcontext->rm_lock);
1218
1219         /* if last in_send_cmd's ISR is pending, wait for it to finish */
1220         result = down_killable(&stcontext->exchange_lock);
1221         if (result == -EINTR)
1222                 dev_err(&spictx->spidev->dev, "sleep for semaphore interrupted by signal\n");
1223
1224         /* next reset the ST95HF controller */
1225         result = st95hf_spi_send(&stcontext->spicontext,
1226                                  &reset_cmd,
1227                                  ST95HF_RESET_CMD_LEN,
1228                                  ASYNC);
1229         if (result)
1230                 dev_err(&spictx->spidev->dev,
1231                         "ST95HF reset failed in remove() err = %d\n", result);
1232
1233         /* wait for 3 ms to complete the controller reset process */
1234         usleep_range(3000, 4000);
1235
1236         /* disable regulator */
1237         if (stcontext->st95hf_supply)
1238                 regulator_disable(stcontext->st95hf_supply);
1239 }
1240
1241 /* Register as SPI protocol driver */
1242 static struct spi_driver st95hf_driver = {
1243         .driver = {
1244                 .name = "st95hf",
1245                 .owner = THIS_MODULE,
1246                 .of_match_table = of_match_ptr(st95hf_spi_of_match),
1247         },
1248         .id_table = st95hf_id,
1249         .probe = st95hf_probe,
1250         .remove = st95hf_remove,
1251 };
1252
1253 module_spi_driver(st95hf_driver);
1254
1255 MODULE_AUTHOR("Shikha Singh <[email protected]>");
1256 MODULE_DESCRIPTION("ST NFC Transceiver ST95HF driver");
1257 MODULE_LICENSE("GPL v2");
This page took 0.116974 seconds and 4 git commands to generate.