root/drivers/nfc/st95hf/core.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. st95hf_send_recv_cmd
  2. st95hf_echo_command
  3. secondary_configuration_type4a
  4. secondary_configuration_type4b
  5. st95hf_select_protocol
  6. st95hf_send_st95enable_negativepulse
  7. st95hf_send_spi_reset_sequence
  8. st95hf_por_sequence
  9. iso14443_config_fdt
  10. st95hf_handle_wtx
  11. st95hf_error_handling
  12. st95hf_response_handler
  13. st95hf_irq_handler
  14. st95hf_irq_thread_handler
  15. st95hf_in_configure_hw
  16. rf_off
  17. st95hf_in_send_cmd
  18. st95hf_tg_configure_hw
  19. st95hf_tg_send_cmd
  20. st95hf_tg_listen
  21. st95hf_tg_get_rf_tech
  22. st95hf_switch_rf
  23. st95hf_abort_cmd
  24. st95hf_probe
  25. st95hf_remove

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

/* [<][>][^][v][top][bottom][index][help] */