Linux Audio

Check our new training course

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