cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

core.c (32972B)


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