18fba2453SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2165063f1SMark A. Greer /*
3165063f1SMark A. Greer * TI TRF7970a RFID/NFC Transceiver Driver
4165063f1SMark A. Greer *
5165063f1SMark A. Greer * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
6165063f1SMark A. Greer *
7165063f1SMark A. Greer * Author: Erick Macias <emacias@ti.com>
8165063f1SMark A. Greer * Author: Felipe Balbi <balbi@ti.com>
9165063f1SMark A. Greer * Author: Mark A. Greer <mgreer@animalcreek.com>
10165063f1SMark A. Greer */
11165063f1SMark A. Greer
12165063f1SMark A. Greer #include <linux/module.h>
13165063f1SMark A. Greer #include <linux/device.h>
14165063f1SMark A. Greer #include <linux/netdevice.h>
15165063f1SMark A. Greer #include <linux/interrupt.h>
16e6403b7cSMark A. Greer #include <linux/pm_runtime.h>
17165063f1SMark A. Greer #include <linux/nfc.h>
18165063f1SMark A. Greer #include <linux/skbuff.h>
19165063f1SMark A. Greer #include <linux/delay.h>
20d34e48d6SMark Greer #include <linux/gpio/consumer.h>
21165063f1SMark A. Greer #include <linux/of.h>
22165063f1SMark A. Greer #include <linux/spi/spi.h>
23165063f1SMark A. Greer #include <linux/regulator/consumer.h>
24165063f1SMark A. Greer
25165063f1SMark A. Greer #include <net/nfc/nfc.h>
26165063f1SMark A. Greer #include <net/nfc/digital.h>
27165063f1SMark A. Greer
28165063f1SMark A. Greer /* There are 3 ways the host can communicate with the trf7970a:
29165063f1SMark A. Greer * parallel mode, SPI with Slave Select (SS) mode, and SPI without
30165063f1SMark A. Greer * SS mode. The driver only supports the two SPI modes.
31165063f1SMark A. Greer *
32165063f1SMark A. Greer * The trf7970a is very timing sensitive and the VIN, EN2, and EN
33165063f1SMark A. Greer * pins must asserted in that order and with specific delays in between.
34165063f1SMark A. Greer * The delays used in the driver were provided by TI and have been
3595064bd9SMark A. Greer * confirmed to work with this driver. There is a bug with the current
3695064bd9SMark A. Greer * version of the trf7970a that requires that EN2 remain low no matter
3795064bd9SMark A. Greer * what. If it goes high, it will generate an RF field even when in
3895064bd9SMark A. Greer * passive target mode. TI has indicated that the chip will work okay
3995064bd9SMark A. Greer * when EN2 is left low. The 'en2-rf-quirk' device tree property
4095064bd9SMark A. Greer * indicates that trf7970a currently being used has the erratum and
4195064bd9SMark A. Greer * that EN2 must be kept low.
42165063f1SMark A. Greer *
43165063f1SMark A. Greer * Timeouts are implemented using the delayed workqueue kernel facility.
44165063f1SMark A. Greer * Timeouts are required so things don't hang when there is no response
45165063f1SMark A. Greer * from the trf7970a (or tag). Using this mechanism creates a race with
46165063f1SMark A. Greer * interrupts, however. That is, an interrupt and a timeout could occur
47165063f1SMark A. Greer * closely enough together that one is blocked by the mutex while the other
48165063f1SMark A. Greer * executes. When the timeout handler executes first and blocks the
49165063f1SMark A. Greer * interrupt handler, it will eventually set the state to IDLE so the
50165063f1SMark A. Greer * interrupt handler will check the state and exit with no harm done.
51165063f1SMark A. Greer * When the interrupt handler executes first and blocks the timeout handler,
52165063f1SMark A. Greer * the cancel_delayed_work() call will know that it didn't cancel the
53165063f1SMark A. Greer * work item (i.e., timeout) and will return zero. That return code is
54165063f1SMark A. Greer * used by the timer handler to indicate that it should ignore the timeout
55165063f1SMark A. Greer * once its unblocked.
56165063f1SMark A. Greer *
57165063f1SMark A. Greer * Aborting an active command isn't as simple as it seems because the only
58165063f1SMark A. Greer * way to abort a command that's already been sent to the tag is so turn
59165063f1SMark A. Greer * off power to the tag. If we do that, though, we'd have to go through
60165063f1SMark A. Greer * the entire anticollision procedure again but the digital layer doesn't
6113b4272aSMark A. Greer * support that. So, if an abort is received before trf7970a_send_cmd()
62165063f1SMark A. Greer * has sent the command to the tag, it simply returns -ECANCELED. If the
63165063f1SMark A. Greer * command has already been sent to the tag, then the driver continues
64165063f1SMark A. Greer * normally and recieves the response data (or error) but just before
65165063f1SMark A. Greer * sending the data upstream, it frees the rx_skb and sends -ECANCELED
66165063f1SMark A. Greer * upstream instead. If the command failed, that error will be sent
67165063f1SMark A. Greer * upstream.
68165063f1SMark A. Greer *
69165063f1SMark A. Greer * When recieving data from a tag and the interrupt status register has
70165063f1SMark A. Greer * only the SRX bit set, it means that all of the data has been received
71165063f1SMark A. Greer * (once what's in the fifo has been read). However, depending on timing
72165063f1SMark A. Greer * an interrupt status with only the SRX bit set may not be recived. In
735fa3af35SMark A. Greer * those cases, the timeout mechanism is used to wait 20 ms in case more
745fa3af35SMark A. Greer * data arrives. After 20 ms, it is assumed that all of the data has been
75165063f1SMark A. Greer * received and the accumulated rx data is sent upstream. The
76165063f1SMark A. Greer * 'TRF7970A_ST_WAIT_FOR_RX_DATA_CONT' state is used for this purpose
77165063f1SMark A. Greer * (i.e., it indicates that some data has been received but we're not sure
78165063f1SMark A. Greer * if there is more coming so a timeout in this state means all data has
795fa3af35SMark A. Greer * been received and there isn't an error). The delay is 20 ms since delays
805fa3af35SMark A. Greer * of ~16 ms have been observed during testing.
81165063f1SMark A. Greer *
8238b4eb1fSMark A. Greer * When transmitting a frame larger than the FIFO size (127 bytes), the
8338b4eb1fSMark A. Greer * driver will wait 20 ms for the FIFO to drain past the low-watermark
8438b4eb1fSMark A. Greer * and generate an interrupt. The low-watermark set to 32 bytes so the
8538b4eb1fSMark A. Greer * interrupt should fire after 127 - 32 = 95 bytes have been sent. At
8638b4eb1fSMark A. Greer * the lowest possible bit rate (6.62 kbps for 15693), it will take up
8738b4eb1fSMark A. Greer * to ~14.35 ms so 20 ms is used for the timeout.
8838b4eb1fSMark A. Greer *
89165063f1SMark A. Greer * Type 2 write and sector select commands respond with a 4-bit ACK or NACK.
90165063f1SMark A. Greer * Having only 4 bits in the FIFO won't normally generate an interrupt so
91165063f1SMark A. Greer * driver enables the '4_bit_RX' bit of the Special Functions register 1
92165063f1SMark A. Greer * to cause an interrupt in that case. Leaving that bit for a read command
93165063f1SMark A. Greer * messes up the data returned so it is only enabled when the framing is
94165063f1SMark A. Greer * 'NFC_DIGITAL_FRAMING_NFCA_T2T' and the command is not a read command.
95165063f1SMark A. Greer * Unfortunately, that means that the driver has to peek into tx frames
96165063f1SMark A. Greer * when the framing is 'NFC_DIGITAL_FRAMING_NFCA_T2T'. This is done by
97165063f1SMark A. Greer * the trf7970a_per_cmd_config() routine.
989d9304b3SMark A. Greer *
999d9304b3SMark A. Greer * ISO/IEC 15693 frames specify whether to use single or double sub-carrier
1009d9304b3SMark A. Greer * frequencies and whether to use low or high data rates in the flags byte
1019d9304b3SMark A. Greer * of the frame. This means that the driver has to peek at all 15693 frames
1029d9304b3SMark A. Greer * to determine what speed to set the communication to. In addition, write
1039d9304b3SMark A. Greer * and lock commands use the OPTION flag to indicate that an EOF must be
1049d9304b3SMark A. Greer * sent to the tag before it will send its response. So the driver has to
1059d9304b3SMark A. Greer * examine all frames for that reason too.
1069d9304b3SMark A. Greer *
1079d9304b3SMark A. Greer * It is unclear how long to wait before sending the EOF. According to the
1089d9304b3SMark A. Greer * Note under Table 1-1 in section 1.6 of
1099d9304b3SMark A. Greer * http://www.ti.com/lit/ug/scbu011/scbu011.pdf, that wait should be at least
1109d9304b3SMark A. Greer * 10 ms for TI Tag-it HF-I tags; however testing has shown that is not long
11138b4eb1fSMark A. Greer * enough so 20 ms is used. So the timer is set to 40 ms - 20 ms to drain
11238b4eb1fSMark A. Greer * up to 127 bytes in the FIFO at the lowest bit rate plus another 20 ms to
11338b4eb1fSMark A. Greer * ensure the wait is long enough before sending the EOF. This seems to work
1149d9304b3SMark A. Greer * reliably.
115165063f1SMark A. Greer */
116165063f1SMark A. Greer
11780062891SMark A. Greer #define TRF7970A_SUPPORTED_PROTOCOLS \
1189d9304b3SMark A. Greer (NFC_PROTO_MIFARE_MASK | NFC_PROTO_ISO14443_MASK | \
1196857bb96SMark A. Greer NFC_PROTO_ISO14443_B_MASK | NFC_PROTO_FELICA_MASK | \
12013b4272aSMark A. Greer NFC_PROTO_ISO15693_MASK | NFC_PROTO_NFC_DEP_MASK)
121165063f1SMark A. Greer
122e6403b7cSMark A. Greer #define TRF7970A_AUTOSUSPEND_DELAY 30000 /* 30 seconds */
123837eb4d2SGeoff Lansberry #define TRF7970A_13MHZ_CLOCK_FREQUENCY 13560000
124837eb4d2SGeoff Lansberry #define TRF7970A_27MHZ_CLOCK_FREQUENCY 27120000
125837eb4d2SGeoff Lansberry
126165063f1SMark A. Greer #define TRF7970A_RX_SKB_ALLOC_SIZE 256
127165063f1SMark A. Greer
1281568bfefSMark A. Greer #define TRF7970A_FIFO_SIZE 127
129165063f1SMark A. Greer
130165063f1SMark A. Greer /* TX length is 3 nibbles long ==> 4KB - 1 bytes max */
131165063f1SMark A. Greer #define TRF7970A_TX_MAX (4096 - 1)
132165063f1SMark A. Greer
1331961843cSMark A. Greer #define TRF7970A_WAIT_FOR_TX_IRQ 20
1345fa3af35SMark A. Greer #define TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT 20
13538b4eb1fSMark A. Greer #define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 20
13638b4eb1fSMark A. Greer #define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 40
137165063f1SMark A. Greer
1384e64eff8SMark A. Greer /* Guard times for various RF technologies (in us) */
1394e64eff8SMark A. Greer #define TRF7970A_GUARD_TIME_NFCA 5000
1404e64eff8SMark A. Greer #define TRF7970A_GUARD_TIME_NFCB 5000
1414e64eff8SMark A. Greer #define TRF7970A_GUARD_TIME_NFCF 20000
1424e64eff8SMark A. Greer #define TRF7970A_GUARD_TIME_15693 1000
1434e64eff8SMark A. Greer
144165063f1SMark A. Greer /* Quirks */
145165063f1SMark A. Greer /* Erratum: When reading IRQ Status register on trf7970a, we must issue a
146165063f1SMark A. Greer * read continuous command for IRQ Status and Collision Position registers.
147165063f1SMark A. Greer */
148772079ebSMark A. Greer #define TRF7970A_QUIRK_IRQ_STATUS_READ BIT(0)
14995064bd9SMark A. Greer #define TRF7970A_QUIRK_EN2_MUST_STAY_LOW BIT(1)
150165063f1SMark A. Greer
151165063f1SMark A. Greer /* Direct commands */
152165063f1SMark A. Greer #define TRF7970A_CMD_IDLE 0x00
153165063f1SMark A. Greer #define TRF7970A_CMD_SOFT_INIT 0x03
154165063f1SMark A. Greer #define TRF7970A_CMD_RF_COLLISION 0x04
155165063f1SMark A. Greer #define TRF7970A_CMD_RF_COLLISION_RESPONSE_N 0x05
156165063f1SMark A. Greer #define TRF7970A_CMD_RF_COLLISION_RESPONSE_0 0x06
157165063f1SMark A. Greer #define TRF7970A_CMD_FIFO_RESET 0x0f
158165063f1SMark A. Greer #define TRF7970A_CMD_TRANSMIT_NO_CRC 0x10
159165063f1SMark A. Greer #define TRF7970A_CMD_TRANSMIT 0x11
160165063f1SMark A. Greer #define TRF7970A_CMD_DELAY_TRANSMIT_NO_CRC 0x12
161165063f1SMark A. Greer #define TRF7970A_CMD_DELAY_TRANSMIT 0x13
162165063f1SMark A. Greer #define TRF7970A_CMD_EOF 0x14
163165063f1SMark A. Greer #define TRF7970A_CMD_CLOSE_SLOT 0x15
164165063f1SMark A. Greer #define TRF7970A_CMD_BLOCK_RX 0x16
165165063f1SMark A. Greer #define TRF7970A_CMD_ENABLE_RX 0x17
166851ee3cbSMark A. Greer #define TRF7970A_CMD_TEST_INT_RF 0x18
167851ee3cbSMark A. Greer #define TRF7970A_CMD_TEST_EXT_RF 0x19
168165063f1SMark A. Greer #define TRF7970A_CMD_RX_GAIN_ADJUST 0x1a
169165063f1SMark A. Greer
170165063f1SMark A. Greer /* Bits determining whether its a direct command or register R/W,
171165063f1SMark A. Greer * whether to use a continuous SPI transaction or not, and the actual
17202c26940Swengjianfeng * direct cmd opcode or register address.
173165063f1SMark A. Greer */
174165063f1SMark A. Greer #define TRF7970A_CMD_BIT_CTRL BIT(7)
175165063f1SMark A. Greer #define TRF7970A_CMD_BIT_RW BIT(6)
176165063f1SMark A. Greer #define TRF7970A_CMD_BIT_CONTINUOUS BIT(5)
177165063f1SMark A. Greer #define TRF7970A_CMD_BIT_OPCODE(opcode) ((opcode) & 0x1f)
178165063f1SMark A. Greer
179165063f1SMark A. Greer /* Registers addresses */
180165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_CTRL 0x00
181165063f1SMark A. Greer #define TRF7970A_ISO_CTRL 0x01
182165063f1SMark A. Greer #define TRF7970A_ISO14443B_TX_OPTIONS 0x02
183165063f1SMark A. Greer #define TRF7970A_ISO14443A_HIGH_BITRATE_OPTIONS 0x03
184165063f1SMark A. Greer #define TRF7970A_TX_TIMER_SETTING_H_BYTE 0x04
185165063f1SMark A. Greer #define TRF7970A_TX_TIMER_SETTING_L_BYTE 0x05
186165063f1SMark A. Greer #define TRF7970A_TX_PULSE_LENGTH_CTRL 0x06
187165063f1SMark A. Greer #define TRF7970A_RX_NO_RESPONSE_WAIT 0x07
188165063f1SMark A. Greer #define TRF7970A_RX_WAIT_TIME 0x08
189165063f1SMark A. Greer #define TRF7970A_MODULATOR_SYS_CLK_CTRL 0x09
190165063f1SMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS 0x0a
191165063f1SMark A. Greer #define TRF7970A_REG_IO_CTRL 0x0b
192165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS 0x0c
193165063f1SMark A. Greer #define TRF7970A_COLLISION_IRQ_MASK 0x0d
194165063f1SMark A. Greer #define TRF7970A_COLLISION_POSITION 0x0e
195165063f1SMark A. Greer #define TRF7970A_RSSI_OSC_STATUS 0x0f
196165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1 0x10
197165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG2 0x11
198165063f1SMark A. Greer #define TRF7970A_RAM1 0x12
199165063f1SMark A. Greer #define TRF7970A_RAM2 0x13
200165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS 0x14
201165063f1SMark A. Greer #define TRF7970A_NFC_LOW_FIELD_LEVEL 0x16
202165063f1SMark A. Greer #define TRF7970A_NFCID1 0x17
203165063f1SMark A. Greer #define TRF7970A_NFC_TARGET_LEVEL 0x18
204165063f1SMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL 0x19
205165063f1SMark A. Greer #define TRF7970A_TEST_REGISTER1 0x1a
206165063f1SMark A. Greer #define TRF7970A_TEST_REGISTER2 0x1b
207165063f1SMark A. Greer #define TRF7970A_FIFO_STATUS 0x1c
208165063f1SMark A. Greer #define TRF7970A_TX_LENGTH_BYTE1 0x1d
209165063f1SMark A. Greer #define TRF7970A_TX_LENGTH_BYTE2 0x1e
210165063f1SMark A. Greer #define TRF7970A_FIFO_IO_REGISTER 0x1f
211165063f1SMark A. Greer
212165063f1SMark A. Greer /* Chip Status Control Register Bits */
213165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_VRS5_3 BIT(0)
214165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_REC_ON BIT(1)
215165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_AGC_ON BIT(2)
216165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_PM_ON BIT(3)
217165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_RF_PWR BIT(4)
218165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_RF_ON BIT(5)
219165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_DIRECT BIT(6)
220165063f1SMark A. Greer #define TRF7970A_CHIP_STATUS_STBY BIT(7)
221165063f1SMark A. Greer
222165063f1SMark A. Greer /* ISO Control Register Bits */
223165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_SGL_1OF4_662 0x00
224165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_SGL_1OF256_662 0x01
225165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648 0x02
226165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_SGL_1OF256_2648 0x03
227165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_DBL_1OF4_667a 0x04
228165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_DBL_1OF256_667 0x05
229165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_DBL_1OF4_2669 0x06
230165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_15693_DBL_1OF256_2669 0x07
231165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443A_106 0x08
232165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443A_212 0x09
233165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443A_424 0x0a
234165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443A_848 0x0b
235165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443B_106 0x0c
236165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443B_212 0x0d
237165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443B_424 0x0e
238165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_14443B_848 0x0f
239165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_FELICA_212 0x1a
240165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_FELICA_424 0x1b
24113b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_NFCA_106 0x01
24213b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_NFCF_212 0x02
24313b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_NFCF_424 0x03
24413b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_CE_14443A 0x00
24513b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_CE_14443B 0x01
24613b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_CE BIT(2)
24713b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_ACTIVE BIT(3)
24813b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_INITIATOR BIT(4)
24913b4272aSMark A. Greer #define TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE BIT(5)
250165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_RFID BIT(5)
251165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_DIR_MODE BIT(6)
252165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_RX_CRC_N BIT(7) /* true == No CRC */
253165063f1SMark A. Greer
254165063f1SMark A. Greer #define TRF7970A_ISO_CTRL_RFID_SPEED_MASK 0x1f
255165063f1SMark A. Greer
256165063f1SMark A. Greer /* Modulator and SYS_CLK Control Register Bits */
257165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH(n) ((n) & 0x7)
258165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK10 (TRF7970A_MODULATOR_DEPTH(0))
259165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_OOK (TRF7970A_MODULATOR_DEPTH(1))
260165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK7 (TRF7970A_MODULATOR_DEPTH(2))
261165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK8_5 (TRF7970A_MODULATOR_DEPTH(3))
262165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK13 (TRF7970A_MODULATOR_DEPTH(4))
263165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK16 (TRF7970A_MODULATOR_DEPTH(5))
264165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK22 (TRF7970A_MODULATOR_DEPTH(6))
265165063f1SMark A. Greer #define TRF7970A_MODULATOR_DEPTH_ASK30 (TRF7970A_MODULATOR_DEPTH(7))
266165063f1SMark A. Greer #define TRF7970A_MODULATOR_EN_ANA BIT(3)
267165063f1SMark A. Greer #define TRF7970A_MODULATOR_CLK(n) (((n) & 0x3) << 4)
268165063f1SMark A. Greer #define TRF7970A_MODULATOR_CLK_DISABLED (TRF7970A_MODULATOR_CLK(0))
269165063f1SMark A. Greer #define TRF7970A_MODULATOR_CLK_3_6 (TRF7970A_MODULATOR_CLK(1))
270165063f1SMark A. Greer #define TRF7970A_MODULATOR_CLK_6_13 (TRF7970A_MODULATOR_CLK(2))
271165063f1SMark A. Greer #define TRF7970A_MODULATOR_CLK_13_27 (TRF7970A_MODULATOR_CLK(3))
272165063f1SMark A. Greer #define TRF7970A_MODULATOR_EN_OOK BIT(6)
273165063f1SMark A. Greer #define TRF7970A_MODULATOR_27MHZ BIT(7)
274165063f1SMark A. Greer
27513b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_NO_LIM BIT(0)
27613b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_AGCR BIT(1)
27713b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_GD_0DB (0x0 << 2)
27813b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_GD_5DB (0x1 << 2)
27913b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_GD_10DB (0x2 << 2)
28013b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_GD_15DB (0x3 << 2)
28113b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_HBT BIT(4)
28213b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_M848 BIT(5)
28313b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_C424 BIT(6)
28413b4272aSMark A. Greer #define TRF7970A_RX_SPECIAL_SETTINGS_C212 BIT(7)
28513b4272aSMark A. Greer
28613b4272aSMark A. Greer #define TRF7970A_REG_IO_CTRL_VRS(v) ((v) & 0x07)
28713b4272aSMark A. Greer #define TRF7970A_REG_IO_CTRL_IO_LOW BIT(5)
28813b4272aSMark A. Greer #define TRF7970A_REG_IO_CTRL_EN_EXT_PA BIT(6)
28913b4272aSMark A. Greer #define TRF7970A_REG_IO_CTRL_AUTO_REG BIT(7)
29013b4272aSMark A. Greer
291165063f1SMark A. Greer /* IRQ Status Register Bits */
292165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_NORESP BIT(0) /* ISO15693 only */
29313b4272aSMark A. Greer #define TRF7970A_IRQ_STATUS_NFC_COL_ERROR BIT(0)
294165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_COL BIT(1)
295165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_FRAMING_EOF_ERROR BIT(2)
29613b4272aSMark A. Greer #define TRF7970A_IRQ_STATUS_NFC_RF BIT(2)
297165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_PARITY_ERROR BIT(3)
29813b4272aSMark A. Greer #define TRF7970A_IRQ_STATUS_NFC_SDD BIT(3)
299165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_CRC_ERROR BIT(4)
30013b4272aSMark A. Greer #define TRF7970A_IRQ_STATUS_NFC_PROTO_ERROR BIT(4)
301165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_FIFO BIT(5)
302165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_SRX BIT(6)
303165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_TX BIT(7)
304165063f1SMark A. Greer
305165063f1SMark A. Greer #define TRF7970A_IRQ_STATUS_ERROR \
306165063f1SMark A. Greer (TRF7970A_IRQ_STATUS_COL | \
307165063f1SMark A. Greer TRF7970A_IRQ_STATUS_FRAMING_EOF_ERROR | \
308165063f1SMark A. Greer TRF7970A_IRQ_STATUS_PARITY_ERROR | \
309165063f1SMark A. Greer TRF7970A_IRQ_STATUS_CRC_ERROR)
310165063f1SMark A. Greer
311851ee3cbSMark A. Greer #define TRF7970A_RSSI_OSC_STATUS_RSSI_MASK (BIT(2) | BIT(1) | BIT(0))
312851ee3cbSMark A. Greer #define TRF7970A_RSSI_OSC_STATUS_RSSI_X_MASK (BIT(5) | BIT(4) | BIT(3))
313851ee3cbSMark A. Greer #define TRF7970A_RSSI_OSC_STATUS_RSSI_OSC_OK BIT(6)
314851ee3cbSMark A. Greer
315165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1_COL_7_6 BIT(0)
316165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL BIT(1)
317165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1_4_BIT_RX BIT(2)
318165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1_SP_DIR_MODE BIT(3)
319165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1_NEXT_SLOT_37US BIT(4)
320165063f1SMark A. Greer #define TRF7970A_SPECIAL_FCN_REG1_PAR43 BIT(5)
321165063f1SMark A. Greer
322165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_124 (0x0 << 2)
323165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_120 (0x1 << 2)
324165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_112 (0x2 << 2)
325165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 (0x3 << 2)
326165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_4 0x0
327165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_8 0x1
328165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_16 0x2
329165063f1SMark A. Greer #define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32 0x3
330165063f1SMark A. Greer
33113b4272aSMark A. Greer #define TRF7970A_NFC_LOW_FIELD_LEVEL_RFDET(v) ((v) & 0x07)
33213b4272aSMark A. Greer #define TRF7970A_NFC_LOW_FIELD_LEVEL_CLEX_DIS BIT(7)
33313b4272aSMark A. Greer
33413b4272aSMark A. Greer #define TRF7970A_NFC_TARGET_LEVEL_RFDET(v) ((v) & 0x07)
33513b4272aSMark A. Greer #define TRF7970A_NFC_TARGET_LEVEL_HI_RF BIT(3)
336ae291f79SMark Greer #define TRF7970A_NFC_TARGET_LEVEL_SDD_EN BIT(5)
33713b4272aSMark A. Greer #define TRF7970A_NFC_TARGET_LEVEL_LD_S_4BYTES (0x0 << 6)
33813b4272aSMark A. Greer #define TRF7970A_NFC_TARGET_LEVEL_LD_S_7BYTES (0x1 << 6)
33913b4272aSMark A. Greer #define TRF7970A_NFC_TARGET_LEVEL_LD_S_10BYTES (0x2 << 6)
34013b4272aSMark A. Greer
341cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_106 BIT(0)
342cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_212 BIT(1)
343cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_424 (BIT(0) | BIT(1))
344cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_PAS_14443B BIT(2)
345cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_PAS_106 BIT(3)
346cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_FELICA BIT(4)
347cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_RF_L BIT(6)
348cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_RF_H BIT(7)
349cb174abaSMark A. Greer
350cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_106A \
351cb174abaSMark A. Greer (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
352cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
353cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_PAS_106 | \
354cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_106)
355cb174abaSMark A. Greer
356cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_106B \
357cb174abaSMark A. Greer (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
358cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
359cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_PAS_14443B | \
360cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_106)
361cb174abaSMark A. Greer
362cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_212F \
363cb174abaSMark A. Greer (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
364cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
365cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_FELICA | \
366cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_212)
367cb174abaSMark A. Greer
368cb174abaSMark A. Greer #define TRF79070A_NFC_TARGET_PROTOCOL_424F \
369cb174abaSMark A. Greer (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
370cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
371cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_FELICA | \
372cb174abaSMark A. Greer TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_424)
373cb174abaSMark A. Greer
374165063f1SMark A. Greer #define TRF7970A_FIFO_STATUS_OVERFLOW BIT(7)
375165063f1SMark A. Greer
376165063f1SMark A. Greer /* NFC (ISO/IEC 14443A) Type 2 Tag commands */
377165063f1SMark A. Greer #define NFC_T2T_CMD_READ 0x30
378165063f1SMark A. Greer
3799d9304b3SMark A. Greer /* ISO 15693 commands codes */
3809d9304b3SMark A. Greer #define ISO15693_CMD_INVENTORY 0x01
3819d9304b3SMark A. Greer #define ISO15693_CMD_READ_SINGLE_BLOCK 0x20
3829d9304b3SMark A. Greer #define ISO15693_CMD_WRITE_SINGLE_BLOCK 0x21
3839d9304b3SMark A. Greer #define ISO15693_CMD_LOCK_BLOCK 0x22
3849d9304b3SMark A. Greer #define ISO15693_CMD_READ_MULTIPLE_BLOCK 0x23
3859d9304b3SMark A. Greer #define ISO15693_CMD_WRITE_MULTIPLE_BLOCK 0x24
3869d9304b3SMark A. Greer #define ISO15693_CMD_SELECT 0x25
3879d9304b3SMark A. Greer #define ISO15693_CMD_RESET_TO_READY 0x26
3889d9304b3SMark A. Greer #define ISO15693_CMD_WRITE_AFI 0x27
3899d9304b3SMark A. Greer #define ISO15693_CMD_LOCK_AFI 0x28
3909d9304b3SMark A. Greer #define ISO15693_CMD_WRITE_DSFID 0x29
3919d9304b3SMark A. Greer #define ISO15693_CMD_LOCK_DSFID 0x2a
3929d9304b3SMark A. Greer #define ISO15693_CMD_GET_SYSTEM_INFO 0x2b
3939d9304b3SMark A. Greer #define ISO15693_CMD_GET_MULTIPLE_BLOCK_SECURITY_STATUS 0x2c
3949d9304b3SMark A. Greer
3959d9304b3SMark A. Greer /* ISO 15693 request and response flags */
3969d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_SUB_CARRIER BIT(0)
3979d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_DATA_RATE BIT(1)
3989d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_INVENTORY BIT(2)
3999d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_PROTOCOL_EXT BIT(3)
4009d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_SELECT BIT(4)
4019d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_AFI BIT(4)
4029d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_ADDRESS BIT(5)
4039d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_NB_SLOTS BIT(5)
4049d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_OPTION BIT(6)
4059d9304b3SMark A. Greer
4069d9304b3SMark A. Greer #define ISO15693_REQ_FLAG_SPEED_MASK \
4079d9304b3SMark A. Greer (ISO15693_REQ_FLAG_SUB_CARRIER | ISO15693_REQ_FLAG_DATA_RATE)
4089d9304b3SMark A. Greer
409165063f1SMark A. Greer enum trf7970a_state {
410ceccd6aaSMark A. Greer TRF7970A_ST_PWR_OFF,
411b5e17d9bSMark A. Greer TRF7970A_ST_RF_OFF,
412165063f1SMark A. Greer TRF7970A_ST_IDLE,
413165063f1SMark A. Greer TRF7970A_ST_IDLE_RX_BLOCKED,
414165063f1SMark A. Greer TRF7970A_ST_WAIT_FOR_TX_FIFO,
415165063f1SMark A. Greer TRF7970A_ST_WAIT_FOR_RX_DATA,
416165063f1SMark A. Greer TRF7970A_ST_WAIT_FOR_RX_DATA_CONT,
4179d9304b3SMark A. Greer TRF7970A_ST_WAIT_TO_ISSUE_EOF,
41813b4272aSMark A. Greer TRF7970A_ST_LISTENING,
419cb174abaSMark A. Greer TRF7970A_ST_LISTENING_MD,
420165063f1SMark A. Greer TRF7970A_ST_MAX
421165063f1SMark A. Greer };
422165063f1SMark A. Greer
423165063f1SMark A. Greer struct trf7970a {
424165063f1SMark A. Greer enum trf7970a_state state;
425165063f1SMark A. Greer struct device *dev;
426165063f1SMark A. Greer struct spi_device *spi;
427*cffee39dSPaul Geurts struct regulator *vin_regulator;
428*cffee39dSPaul Geurts struct regulator *vddio_regulator;
429165063f1SMark A. Greer struct nfc_digital_dev *ddev;
430165063f1SMark A. Greer u32 quirks;
43113b4272aSMark A. Greer bool is_initiator;
432165063f1SMark A. Greer bool aborting;
433165063f1SMark A. Greer struct sk_buff *tx_skb;
434165063f1SMark A. Greer struct sk_buff *rx_skb;
435165063f1SMark A. Greer nfc_digital_cmd_complete_t cb;
436165063f1SMark A. Greer void *cb_arg;
437ebcc5a0dSMark A. Greer u8 chip_status_ctrl;
438165063f1SMark A. Greer u8 iso_ctrl;
43949d19cc7SMark A. Greer u8 iso_ctrl_tech;
44012e9ade3SMark A. Greer u8 modulator_sys_clk_ctrl;
441165063f1SMark A. Greer u8 special_fcn_reg1;
44249d22c70SGeoff Lansberry u8 io_ctrl;
4434e64eff8SMark A. Greer unsigned int guard_time;
444165063f1SMark A. Greer int technology;
445165063f1SMark A. Greer int framing;
446cb174abaSMark A. Greer u8 md_rf_tech;
447165063f1SMark A. Greer u8 tx_cmd;
4489d9304b3SMark A. Greer bool issue_eof;
449d34e48d6SMark Greer struct gpio_desc *en_gpiod;
450d34e48d6SMark Greer struct gpio_desc *en2_gpiod;
451165063f1SMark A. Greer struct mutex lock;
452165063f1SMark A. Greer unsigned int timeout;
453165063f1SMark A. Greer bool ignore_timeout;
454165063f1SMark A. Greer struct delayed_work timeout_work;
455165063f1SMark A. Greer };
456165063f1SMark A. Greer
trf7970a_cmd(struct trf7970a * trf,u8 opcode)457165063f1SMark A. Greer static int trf7970a_cmd(struct trf7970a *trf, u8 opcode)
458165063f1SMark A. Greer {
459165063f1SMark A. Greer u8 cmd = TRF7970A_CMD_BIT_CTRL | TRF7970A_CMD_BIT_OPCODE(opcode);
460165063f1SMark A. Greer int ret;
461165063f1SMark A. Greer
462165063f1SMark A. Greer dev_dbg(trf->dev, "cmd: 0x%x\n", cmd);
463165063f1SMark A. Greer
464165063f1SMark A. Greer ret = spi_write(trf->spi, &cmd, 1);
465165063f1SMark A. Greer if (ret)
466165063f1SMark A. Greer dev_err(trf->dev, "%s - cmd: 0x%x, ret: %d\n", __func__, cmd,
467165063f1SMark A. Greer ret);
468165063f1SMark A. Greer return ret;
469165063f1SMark A. Greer }
470165063f1SMark A. Greer
trf7970a_read(struct trf7970a * trf,u8 reg,u8 * val)471165063f1SMark A. Greer static int trf7970a_read(struct trf7970a *trf, u8 reg, u8 *val)
472165063f1SMark A. Greer {
473165063f1SMark A. Greer u8 addr = TRF7970A_CMD_BIT_RW | reg;
474165063f1SMark A. Greer int ret;
475165063f1SMark A. Greer
476165063f1SMark A. Greer ret = spi_write_then_read(trf->spi, &addr, 1, val, 1);
477165063f1SMark A. Greer if (ret)
478165063f1SMark A. Greer dev_err(trf->dev, "%s - addr: 0x%x, ret: %d\n", __func__, addr,
479165063f1SMark A. Greer ret);
480165063f1SMark A. Greer
481165063f1SMark A. Greer dev_dbg(trf->dev, "read(0x%x): 0x%x\n", addr, *val);
482165063f1SMark A. Greer
483165063f1SMark A. Greer return ret;
484165063f1SMark A. Greer }
485165063f1SMark A. Greer
trf7970a_read_cont(struct trf7970a * trf,u8 reg,u8 * buf,size_t len)486e2f0f671SMark Greer static int trf7970a_read_cont(struct trf7970a *trf, u8 reg, u8 *buf,
487e2f0f671SMark Greer size_t len)
488165063f1SMark A. Greer {
489165063f1SMark A. Greer u8 addr = reg | TRF7970A_CMD_BIT_RW | TRF7970A_CMD_BIT_CONTINUOUS;
4903e7f3356SMark A. Greer struct spi_transfer t[2];
4913e7f3356SMark A. Greer struct spi_message m;
492165063f1SMark A. Greer int ret;
493165063f1SMark A. Greer
494165063f1SMark A. Greer dev_dbg(trf->dev, "read_cont(0x%x, %zd)\n", addr, len);
495165063f1SMark A. Greer
4963e7f3356SMark A. Greer spi_message_init(&m);
4973e7f3356SMark A. Greer
4983e7f3356SMark A. Greer memset(&t, 0, sizeof(t));
4993e7f3356SMark A. Greer
5003e7f3356SMark A. Greer t[0].tx_buf = &addr;
5013e7f3356SMark A. Greer t[0].len = sizeof(addr);
5023e7f3356SMark A. Greer spi_message_add_tail(&t[0], &m);
5033e7f3356SMark A. Greer
5043e7f3356SMark A. Greer t[1].rx_buf = buf;
5053e7f3356SMark A. Greer t[1].len = len;
5063e7f3356SMark A. Greer spi_message_add_tail(&t[1], &m);
5073e7f3356SMark A. Greer
5083e7f3356SMark A. Greer ret = spi_sync(trf->spi, &m);
509165063f1SMark A. Greer if (ret)
510165063f1SMark A. Greer dev_err(trf->dev, "%s - addr: 0x%x, ret: %d\n", __func__, addr,
511165063f1SMark A. Greer ret);
512165063f1SMark A. Greer return ret;
513165063f1SMark A. Greer }
514165063f1SMark A. Greer
trf7970a_write(struct trf7970a * trf,u8 reg,u8 val)515165063f1SMark A. Greer static int trf7970a_write(struct trf7970a *trf, u8 reg, u8 val)
516165063f1SMark A. Greer {
517165063f1SMark A. Greer u8 buf[2] = { reg, val };
518165063f1SMark A. Greer int ret;
519165063f1SMark A. Greer
520165063f1SMark A. Greer dev_dbg(trf->dev, "write(0x%x): 0x%x\n", reg, val);
521165063f1SMark A. Greer
522165063f1SMark A. Greer ret = spi_write(trf->spi, buf, 2);
523165063f1SMark A. Greer if (ret)
524165063f1SMark A. Greer dev_err(trf->dev, "%s - write: 0x%x 0x%x, ret: %d\n", __func__,
525165063f1SMark A. Greer buf[0], buf[1], ret);
526165063f1SMark A. Greer
527165063f1SMark A. Greer return ret;
528165063f1SMark A. Greer }
529165063f1SMark A. Greer
trf7970a_read_irqstatus(struct trf7970a * trf,u8 * status)530165063f1SMark A. Greer static int trf7970a_read_irqstatus(struct trf7970a *trf, u8 *status)
531165063f1SMark A. Greer {
532165063f1SMark A. Greer int ret;
533165063f1SMark A. Greer u8 buf[2];
534165063f1SMark A. Greer u8 addr;
535165063f1SMark A. Greer
536165063f1SMark A. Greer addr = TRF7970A_IRQ_STATUS | TRF7970A_CMD_BIT_RW;
537165063f1SMark A. Greer
538772079ebSMark A. Greer if (trf->quirks & TRF7970A_QUIRK_IRQ_STATUS_READ) {
539165063f1SMark A. Greer addr |= TRF7970A_CMD_BIT_CONTINUOUS;
540165063f1SMark A. Greer ret = spi_write_then_read(trf->spi, &addr, 1, buf, 2);
541165063f1SMark A. Greer } else {
542165063f1SMark A. Greer ret = spi_write_then_read(trf->spi, &addr, 1, buf, 1);
543165063f1SMark A. Greer }
544165063f1SMark A. Greer
545165063f1SMark A. Greer if (ret)
546165063f1SMark A. Greer dev_err(trf->dev, "%s - irqstatus: Status read failed: %d\n",
547165063f1SMark A. Greer __func__, ret);
548165063f1SMark A. Greer else
549165063f1SMark A. Greer *status = buf[0];
550165063f1SMark A. Greer
551165063f1SMark A. Greer return ret;
552165063f1SMark A. Greer }
553165063f1SMark A. Greer
trf7970a_read_target_proto(struct trf7970a * trf,u8 * target_proto)554cb174abaSMark A. Greer static int trf7970a_read_target_proto(struct trf7970a *trf, u8 *target_proto)
555cb174abaSMark A. Greer {
556cb174abaSMark A. Greer int ret;
557cb174abaSMark A. Greer u8 buf[2];
558cb174abaSMark A. Greer u8 addr;
559cb174abaSMark A. Greer
560cb174abaSMark A. Greer addr = TRF79070A_NFC_TARGET_PROTOCOL | TRF7970A_CMD_BIT_RW |
561cb174abaSMark A. Greer TRF7970A_CMD_BIT_CONTINUOUS;
562cb174abaSMark A. Greer
563cb174abaSMark A. Greer ret = spi_write_then_read(trf->spi, &addr, 1, buf, 2);
564cb174abaSMark A. Greer if (ret)
565cb174abaSMark A. Greer dev_err(trf->dev, "%s - target_proto: Read failed: %d\n",
566cb174abaSMark A. Greer __func__, ret);
567cb174abaSMark A. Greer else
568cb174abaSMark A. Greer *target_proto = buf[0];
569cb174abaSMark A. Greer
570cb174abaSMark A. Greer return ret;
571cb174abaSMark A. Greer }
572cb174abaSMark A. Greer
trf7970a_mode_detect(struct trf7970a * trf,u8 * rf_tech)573cb174abaSMark A. Greer static int trf7970a_mode_detect(struct trf7970a *trf, u8 *rf_tech)
574cb174abaSMark A. Greer {
575cb174abaSMark A. Greer int ret;
576cb174abaSMark A. Greer u8 target_proto, tech;
577cb174abaSMark A. Greer
578cb174abaSMark A. Greer ret = trf7970a_read_target_proto(trf, &target_proto);
579cb174abaSMark A. Greer if (ret)
580cb174abaSMark A. Greer return ret;
581cb174abaSMark A. Greer
582cb174abaSMark A. Greer switch (target_proto) {
583cb174abaSMark A. Greer case TRF79070A_NFC_TARGET_PROTOCOL_106A:
584cb174abaSMark A. Greer tech = NFC_DIGITAL_RF_TECH_106A;
585cb174abaSMark A. Greer break;
586cb174abaSMark A. Greer case TRF79070A_NFC_TARGET_PROTOCOL_106B:
587cb174abaSMark A. Greer tech = NFC_DIGITAL_RF_TECH_106B;
588cb174abaSMark A. Greer break;
589cb174abaSMark A. Greer case TRF79070A_NFC_TARGET_PROTOCOL_212F:
590cb174abaSMark A. Greer tech = NFC_DIGITAL_RF_TECH_212F;
591cb174abaSMark A. Greer break;
592cb174abaSMark A. Greer case TRF79070A_NFC_TARGET_PROTOCOL_424F:
593cb174abaSMark A. Greer tech = NFC_DIGITAL_RF_TECH_424F;
594cb174abaSMark A. Greer break;
595cb174abaSMark A. Greer default:
596cb174abaSMark A. Greer dev_dbg(trf->dev, "%s - mode_detect: target_proto: 0x%x\n",
597cb174abaSMark A. Greer __func__, target_proto);
598cb174abaSMark A. Greer return -EIO;
599cb174abaSMark A. Greer }
600cb174abaSMark A. Greer
601cb174abaSMark A. Greer *rf_tech = tech;
602cb174abaSMark A. Greer
603cb174abaSMark A. Greer return ret;
604cb174abaSMark A. Greer }
605cb174abaSMark A. Greer
trf7970a_send_upstream(struct trf7970a * trf)606165063f1SMark A. Greer static void trf7970a_send_upstream(struct trf7970a *trf)
607165063f1SMark A. Greer {
608165063f1SMark A. Greer dev_kfree_skb_any(trf->tx_skb);
609165063f1SMark A. Greer trf->tx_skb = NULL;
610165063f1SMark A. Greer
611165063f1SMark A. Greer if (trf->rx_skb && !IS_ERR(trf->rx_skb) && !trf->aborting)
612165063f1SMark A. Greer print_hex_dump_debug("trf7970a rx data: ", DUMP_PREFIX_NONE,
613165063f1SMark A. Greer 16, 1, trf->rx_skb->data, trf->rx_skb->len,
614165063f1SMark A. Greer false);
615165063f1SMark A. Greer
616165063f1SMark A. Greer trf->state = TRF7970A_ST_IDLE;
617165063f1SMark A. Greer
618165063f1SMark A. Greer if (trf->aborting) {
619165063f1SMark A. Greer dev_dbg(trf->dev, "Abort process complete\n");
620165063f1SMark A. Greer
621165063f1SMark A. Greer if (!IS_ERR(trf->rx_skb)) {
622165063f1SMark A. Greer kfree_skb(trf->rx_skb);
623165063f1SMark A. Greer trf->rx_skb = ERR_PTR(-ECANCELED);
624165063f1SMark A. Greer }
625165063f1SMark A. Greer
626165063f1SMark A. Greer trf->aborting = false;
627165063f1SMark A. Greer }
628165063f1SMark A. Greer
629165063f1SMark A. Greer trf->cb(trf->ddev, trf->cb_arg, trf->rx_skb);
630165063f1SMark A. Greer
631165063f1SMark A. Greer trf->rx_skb = NULL;
632165063f1SMark A. Greer }
633165063f1SMark A. Greer
trf7970a_send_err_upstream(struct trf7970a * trf,int errno)634165063f1SMark A. Greer static void trf7970a_send_err_upstream(struct trf7970a *trf, int errno)
635165063f1SMark A. Greer {
636165063f1SMark A. Greer dev_dbg(trf->dev, "Error - state: %d, errno: %d\n", trf->state, errno);
637165063f1SMark A. Greer
6386fb9edcbSMark A. Greer cancel_delayed_work(&trf->timeout_work);
6396fb9edcbSMark A. Greer
640165063f1SMark A. Greer kfree_skb(trf->rx_skb);
641165063f1SMark A. Greer trf->rx_skb = ERR_PTR(errno);
642165063f1SMark A. Greer
643165063f1SMark A. Greer trf7970a_send_upstream(trf);
644165063f1SMark A. Greer }
645165063f1SMark A. Greer
trf7970a_transmit(struct trf7970a * trf,struct sk_buff * skb,unsigned int len,const u8 * prefix,unsigned int prefix_len)646165063f1SMark A. Greer static int trf7970a_transmit(struct trf7970a *trf, struct sk_buff *skb,
647ea050c5eSKrzysztof Kozlowski unsigned int len, const u8 *prefix,
648e2f0f671SMark Greer unsigned int prefix_len)
649165063f1SMark A. Greer {
6507a1e5552SMark A. Greer struct spi_transfer t[2];
6517a1e5552SMark A. Greer struct spi_message m;
652165063f1SMark A. Greer unsigned int timeout;
653165063f1SMark A. Greer int ret;
654165063f1SMark A. Greer
655165063f1SMark A. Greer print_hex_dump_debug("trf7970a tx data: ", DUMP_PREFIX_NONE,
656165063f1SMark A. Greer 16, 1, skb->data, len, false);
657165063f1SMark A. Greer
6587a1e5552SMark A. Greer spi_message_init(&m);
6597a1e5552SMark A. Greer
6607a1e5552SMark A. Greer memset(&t, 0, sizeof(t));
6617a1e5552SMark A. Greer
6627a1e5552SMark A. Greer t[0].tx_buf = prefix;
6637a1e5552SMark A. Greer t[0].len = prefix_len;
6647a1e5552SMark A. Greer spi_message_add_tail(&t[0], &m);
6657a1e5552SMark A. Greer
6667a1e5552SMark A. Greer t[1].tx_buf = skb->data;
6677a1e5552SMark A. Greer t[1].len = len;
6687a1e5552SMark A. Greer spi_message_add_tail(&t[1], &m);
6697a1e5552SMark A. Greer
6707a1e5552SMark A. Greer ret = spi_sync(trf->spi, &m);
671165063f1SMark A. Greer if (ret) {
672165063f1SMark A. Greer dev_err(trf->dev, "%s - Can't send tx data: %d\n", __func__,
673165063f1SMark A. Greer ret);
674165063f1SMark A. Greer return ret;
675165063f1SMark A. Greer }
676165063f1SMark A. Greer
677165063f1SMark A. Greer skb_pull(skb, len);
678165063f1SMark A. Greer
679165063f1SMark A. Greer if (skb->len > 0) {
680165063f1SMark A. Greer trf->state = TRF7970A_ST_WAIT_FOR_TX_FIFO;
681165063f1SMark A. Greer timeout = TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT;
682165063f1SMark A. Greer } else {
6839d9304b3SMark A. Greer if (trf->issue_eof) {
6849d9304b3SMark A. Greer trf->state = TRF7970A_ST_WAIT_TO_ISSUE_EOF;
6859d9304b3SMark A. Greer timeout = TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF;
6869d9304b3SMark A. Greer } else {
687165063f1SMark A. Greer trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA;
6881961843cSMark A. Greer
6891961843cSMark A. Greer if (!trf->timeout)
6901961843cSMark A. Greer timeout = TRF7970A_WAIT_FOR_TX_IRQ;
6911961843cSMark A. Greer else
692165063f1SMark A. Greer timeout = trf->timeout;
693165063f1SMark A. Greer }
6949d9304b3SMark A. Greer }
695165063f1SMark A. Greer
696165063f1SMark A. Greer dev_dbg(trf->dev, "Setting timeout for %d ms, state: %d\n", timeout,
697165063f1SMark A. Greer trf->state);
698165063f1SMark A. Greer
699165063f1SMark A. Greer schedule_delayed_work(&trf->timeout_work, msecs_to_jiffies(timeout));
700165063f1SMark A. Greer
701165063f1SMark A. Greer return 0;
702165063f1SMark A. Greer }
703165063f1SMark A. Greer
trf7970a_fill_fifo(struct trf7970a * trf)704165063f1SMark A. Greer static void trf7970a_fill_fifo(struct trf7970a *trf)
705165063f1SMark A. Greer {
706165063f1SMark A. Greer struct sk_buff *skb = trf->tx_skb;
707165063f1SMark A. Greer unsigned int len;
708165063f1SMark A. Greer int ret;
709165063f1SMark A. Greer u8 fifo_bytes;
7107a1e5552SMark A. Greer u8 prefix;
711165063f1SMark A. Greer
712165063f1SMark A. Greer ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS, &fifo_bytes);
713165063f1SMark A. Greer if (ret) {
714165063f1SMark A. Greer trf7970a_send_err_upstream(trf, ret);
715165063f1SMark A. Greer return;
716165063f1SMark A. Greer }
717165063f1SMark A. Greer
718165063f1SMark A. Greer dev_dbg(trf->dev, "Filling FIFO - fifo_bytes: 0x%x\n", fifo_bytes);
719165063f1SMark A. Greer
7204542e834SMark A. Greer fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
721165063f1SMark A. Greer
722165063f1SMark A. Greer /* Calculate how much more data can be written to the fifo */
723165063f1SMark A. Greer len = TRF7970A_FIFO_SIZE - fifo_bytes;
7240e840ed5SMark A. Greer if (!len) {
7250e840ed5SMark A. Greer schedule_delayed_work(&trf->timeout_work,
7260e840ed5SMark A. Greer msecs_to_jiffies(TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT));
7270e840ed5SMark A. Greer return;
7280e840ed5SMark A. Greer }
7290e840ed5SMark A. Greer
730165063f1SMark A. Greer len = min(skb->len, len);
731165063f1SMark A. Greer
7327a1e5552SMark A. Greer prefix = TRF7970A_CMD_BIT_CONTINUOUS | TRF7970A_FIFO_IO_REGISTER;
7337a1e5552SMark A. Greer
7347a1e5552SMark A. Greer ret = trf7970a_transmit(trf, skb, len, &prefix, sizeof(prefix));
735165063f1SMark A. Greer if (ret)
736165063f1SMark A. Greer trf7970a_send_err_upstream(trf, ret);
737165063f1SMark A. Greer }
738165063f1SMark A. Greer
trf7970a_drain_fifo(struct trf7970a * trf,u8 status)739165063f1SMark A. Greer static void trf7970a_drain_fifo(struct trf7970a *trf, u8 status)
740165063f1SMark A. Greer {
741165063f1SMark A. Greer struct sk_buff *skb = trf->rx_skb;
742165063f1SMark A. Greer int ret;
743165063f1SMark A. Greer u8 fifo_bytes;
744165063f1SMark A. Greer
745165063f1SMark A. Greer if (status & TRF7970A_IRQ_STATUS_ERROR) {
746165063f1SMark A. Greer trf7970a_send_err_upstream(trf, -EIO);
747165063f1SMark A. Greer return;
748165063f1SMark A. Greer }
749165063f1SMark A. Greer
750165063f1SMark A. Greer ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS, &fifo_bytes);
751165063f1SMark A. Greer if (ret) {
752165063f1SMark A. Greer trf7970a_send_err_upstream(trf, ret);
753165063f1SMark A. Greer return;
754165063f1SMark A. Greer }
755165063f1SMark A. Greer
756165063f1SMark A. Greer dev_dbg(trf->dev, "Draining FIFO - fifo_bytes: 0x%x\n", fifo_bytes);
757165063f1SMark A. Greer
7584542e834SMark A. Greer fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
7594542e834SMark A. Greer
760165063f1SMark A. Greer if (!fifo_bytes)
761165063f1SMark A. Greer goto no_rx_data;
762165063f1SMark A. Greer
763165063f1SMark A. Greer if (fifo_bytes > skb_tailroom(skb)) {
764165063f1SMark A. Greer skb = skb_copy_expand(skb, skb_headroom(skb),
765165063f1SMark A. Greer max_t(int, fifo_bytes,
766165063f1SMark A. Greer TRF7970A_RX_SKB_ALLOC_SIZE),
767165063f1SMark A. Greer GFP_KERNEL);
768165063f1SMark A. Greer if (!skb) {
769165063f1SMark A. Greer trf7970a_send_err_upstream(trf, -ENOMEM);
770165063f1SMark A. Greer return;
771165063f1SMark A. Greer }
772165063f1SMark A. Greer
773165063f1SMark A. Greer kfree_skb(trf->rx_skb);
774165063f1SMark A. Greer trf->rx_skb = skb;
775165063f1SMark A. Greer }
776165063f1SMark A. Greer
777165063f1SMark A. Greer ret = trf7970a_read_cont(trf, TRF7970A_FIFO_IO_REGISTER,
778165063f1SMark A. Greer skb_put(skb, fifo_bytes), fifo_bytes);
779165063f1SMark A. Greer if (ret) {
780165063f1SMark A. Greer trf7970a_send_err_upstream(trf, ret);
781165063f1SMark A. Greer return;
782165063f1SMark A. Greer }
783165063f1SMark A. Greer
784165063f1SMark A. Greer /* If received Type 2 ACK/NACK, shift right 4 bits and pass up */
785165063f1SMark A. Greer if ((trf->framing == NFC_DIGITAL_FRAMING_NFCA_T2T) && (skb->len == 1) &&
786e2f0f671SMark Greer (trf->special_fcn_reg1 == TRF7970A_SPECIAL_FCN_REG1_4_BIT_RX)) {
787165063f1SMark A. Greer skb->data[0] >>= 4;
788165063f1SMark A. Greer status = TRF7970A_IRQ_STATUS_SRX;
789165063f1SMark A. Greer } else {
790165063f1SMark A. Greer trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA_CONT;
7915d8f7594SMark A. Greer
7925d8f7594SMark A. Greer ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS, &fifo_bytes);
7935d8f7594SMark A. Greer if (ret) {
7945d8f7594SMark A. Greer trf7970a_send_err_upstream(trf, ret);
7955d8f7594SMark A. Greer return;
7965d8f7594SMark A. Greer }
7975d8f7594SMark A. Greer
7985d8f7594SMark A. Greer fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
7995d8f7594SMark A. Greer
8005d8f7594SMark A. Greer /* If there are bytes in the FIFO, set status to '0' so
8015d8f7594SMark A. Greer * the if stmt below doesn't fire and the driver will wait
8025d8f7594SMark A. Greer * for the trf7970a to generate another RX interrupt.
8035d8f7594SMark A. Greer */
8045d8f7594SMark A. Greer if (fifo_bytes)
8055d8f7594SMark A. Greer status = 0;
806165063f1SMark A. Greer }
807165063f1SMark A. Greer
808165063f1SMark A. Greer no_rx_data:
809165063f1SMark A. Greer if (status == TRF7970A_IRQ_STATUS_SRX) { /* Receive complete */
810165063f1SMark A. Greer trf7970a_send_upstream(trf);
811165063f1SMark A. Greer return;
812165063f1SMark A. Greer }
813165063f1SMark A. Greer
814165063f1SMark A. Greer dev_dbg(trf->dev, "Setting timeout for %d ms\n",
815165063f1SMark A. Greer TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT);
816165063f1SMark A. Greer
817165063f1SMark A. Greer schedule_delayed_work(&trf->timeout_work,
818165063f1SMark A. Greer msecs_to_jiffies(TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT));
819165063f1SMark A. Greer }
820165063f1SMark A. Greer
trf7970a_irq(int irq,void * dev_id)821165063f1SMark A. Greer static irqreturn_t trf7970a_irq(int irq, void *dev_id)
822165063f1SMark A. Greer {
823165063f1SMark A. Greer struct trf7970a *trf = dev_id;
824165063f1SMark A. Greer int ret;
82513b4272aSMark A. Greer u8 status, fifo_bytes, iso_ctrl;
826165063f1SMark A. Greer
827165063f1SMark A. Greer mutex_lock(&trf->lock);
828165063f1SMark A. Greer
829b5e17d9bSMark A. Greer if (trf->state == TRF7970A_ST_RF_OFF) {
830165063f1SMark A. Greer mutex_unlock(&trf->lock);
831165063f1SMark A. Greer return IRQ_NONE;
832165063f1SMark A. Greer }
833165063f1SMark A. Greer
834165063f1SMark A. Greer ret = trf7970a_read_irqstatus(trf, &status);
835165063f1SMark A. Greer if (ret) {
836165063f1SMark A. Greer mutex_unlock(&trf->lock);
837165063f1SMark A. Greer return IRQ_NONE;
838165063f1SMark A. Greer }
839165063f1SMark A. Greer
840165063f1SMark A. Greer dev_dbg(trf->dev, "IRQ - state: %d, status: 0x%x\n", trf->state,
841165063f1SMark A. Greer status);
842165063f1SMark A. Greer
843165063f1SMark A. Greer if (!status) {
844165063f1SMark A. Greer mutex_unlock(&trf->lock);
845165063f1SMark A. Greer return IRQ_NONE;
846165063f1SMark A. Greer }
847165063f1SMark A. Greer
848165063f1SMark A. Greer switch (trf->state) {
849165063f1SMark A. Greer case TRF7970A_ST_IDLE:
850165063f1SMark A. Greer case TRF7970A_ST_IDLE_RX_BLOCKED:
85113b4272aSMark A. Greer /* If initiator and getting interrupts caused by RF noise,
85213b4272aSMark A. Greer * turn off the receiver to avoid unnecessary interrupts.
85313b4272aSMark A. Greer * It will be turned back on in trf7970a_send_cmd() when
85413b4272aSMark A. Greer * the next command is issued.
855165063f1SMark A. Greer */
85613b4272aSMark A. Greer if (trf->is_initiator && (status & TRF7970A_IRQ_STATUS_ERROR)) {
857165063f1SMark A. Greer trf7970a_cmd(trf, TRF7970A_CMD_BLOCK_RX);
858165063f1SMark A. Greer trf->state = TRF7970A_ST_IDLE_RX_BLOCKED;
859165063f1SMark A. Greer }
860165063f1SMark A. Greer
861165063f1SMark A. Greer trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
862165063f1SMark A. Greer break;
863165063f1SMark A. Greer case TRF7970A_ST_WAIT_FOR_TX_FIFO:
864165063f1SMark A. Greer if (status & TRF7970A_IRQ_STATUS_TX) {
865165063f1SMark A. Greer trf->ignore_timeout =
866165063f1SMark A. Greer !cancel_delayed_work(&trf->timeout_work);
867165063f1SMark A. Greer trf7970a_fill_fifo(trf);
868165063f1SMark A. Greer } else {
869165063f1SMark A. Greer trf7970a_send_err_upstream(trf, -EIO);
870165063f1SMark A. Greer }
871165063f1SMark A. Greer break;
872165063f1SMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA:
873165063f1SMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
874165063f1SMark A. Greer if (status & TRF7970A_IRQ_STATUS_SRX) {
875165063f1SMark A. Greer trf->ignore_timeout =
876165063f1SMark A. Greer !cancel_delayed_work(&trf->timeout_work);
877165063f1SMark A. Greer trf7970a_drain_fifo(trf, status);
878bece3c54SMark A. Greer } else if (status & TRF7970A_IRQ_STATUS_FIFO) {
879bece3c54SMark A. Greer ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS,
880bece3c54SMark A. Greer &fifo_bytes);
881bece3c54SMark A. Greer
882bece3c54SMark A. Greer fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
883bece3c54SMark A. Greer
884bece3c54SMark A. Greer if (ret)
885bece3c54SMark A. Greer trf7970a_send_err_upstream(trf, ret);
886bece3c54SMark A. Greer else if (!fifo_bytes)
887bece3c54SMark A. Greer trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
88813b4272aSMark A. Greer } else if ((status == TRF7970A_IRQ_STATUS_TX) ||
88913b4272aSMark A. Greer (!trf->is_initiator &&
89013b4272aSMark A. Greer (status == (TRF7970A_IRQ_STATUS_TX |
89113b4272aSMark A. Greer TRF7970A_IRQ_STATUS_NFC_RF)))) {
8924dd836e4SMark A. Greer trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
8931961843cSMark A. Greer
8941961843cSMark A. Greer if (!trf->timeout) {
895e2f0f671SMark Greer trf->ignore_timeout =
896e2f0f671SMark Greer !cancel_delayed_work(&trf->timeout_work);
8971961843cSMark A. Greer trf->rx_skb = ERR_PTR(0);
8981961843cSMark A. Greer trf7970a_send_upstream(trf);
8991961843cSMark A. Greer break;
9001961843cSMark A. Greer }
90113b4272aSMark A. Greer
90213b4272aSMark A. Greer if (trf->is_initiator)
90313b4272aSMark A. Greer break;
90413b4272aSMark A. Greer
90513b4272aSMark A. Greer iso_ctrl = trf->iso_ctrl;
90613b4272aSMark A. Greer
90713b4272aSMark A. Greer switch (trf->framing) {
90813b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_STANDARD:
90913b4272aSMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT_NO_CRC;
91013b4272aSMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_RX_CRC_N;
91113b4272aSMark A. Greer trf->iso_ctrl = 0xff; /* Force ISO_CTRL write */
91213b4272aSMark A. Greer break;
91313b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A:
91413b4272aSMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
91513b4272aSMark A. Greer iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
91613b4272aSMark A. Greer trf->iso_ctrl = 0xff; /* Force ISO_CTRL write */
91713b4272aSMark A. Greer break;
91813b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE:
91913b4272aSMark A. Greer ret = trf7970a_write(trf,
92013b4272aSMark A. Greer TRF7970A_SPECIAL_FCN_REG1,
92113b4272aSMark A. Greer TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL);
92213b4272aSMark A. Greer if (ret)
923b9e3016aSMark A. Greer goto err_unlock_exit;
92413b4272aSMark A. Greer
92513b4272aSMark A. Greer trf->special_fcn_reg1 =
92613b4272aSMark A. Greer TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL;
92713b4272aSMark A. Greer break;
92813b4272aSMark A. Greer default:
92913b4272aSMark A. Greer break;
93013b4272aSMark A. Greer }
93113b4272aSMark A. Greer
93213b4272aSMark A. Greer if (iso_ctrl != trf->iso_ctrl) {
93313b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_ISO_CTRL,
93413b4272aSMark A. Greer iso_ctrl);
93513b4272aSMark A. Greer if (ret)
936b9e3016aSMark A. Greer goto err_unlock_exit;
93713b4272aSMark A. Greer
93813b4272aSMark A. Greer trf->iso_ctrl = iso_ctrl;
93913b4272aSMark A. Greer }
9404dd836e4SMark A. Greer } else {
941165063f1SMark A. Greer trf7970a_send_err_upstream(trf, -EIO);
942165063f1SMark A. Greer }
943165063f1SMark A. Greer break;
9449d9304b3SMark A. Greer case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
9459d9304b3SMark A. Greer if (status != TRF7970A_IRQ_STATUS_TX)
9469d9304b3SMark A. Greer trf7970a_send_err_upstream(trf, -EIO);
9479d9304b3SMark A. Greer break;
94813b4272aSMark A. Greer case TRF7970A_ST_LISTENING:
94913b4272aSMark A. Greer if (status & TRF7970A_IRQ_STATUS_SRX) {
95013b4272aSMark A. Greer trf->ignore_timeout =
95113b4272aSMark A. Greer !cancel_delayed_work(&trf->timeout_work);
95213b4272aSMark A. Greer trf7970a_drain_fifo(trf, status);
95313b4272aSMark A. Greer } else if (!(status & TRF7970A_IRQ_STATUS_NFC_RF)) {
95413b4272aSMark A. Greer trf7970a_send_err_upstream(trf, -EIO);
95513b4272aSMark A. Greer }
95613b4272aSMark A. Greer break;
957cb174abaSMark A. Greer case TRF7970A_ST_LISTENING_MD:
958cb174abaSMark A. Greer if (status & TRF7970A_IRQ_STATUS_SRX) {
959cb174abaSMark A. Greer trf->ignore_timeout =
960cb174abaSMark A. Greer !cancel_delayed_work(&trf->timeout_work);
961cb174abaSMark A. Greer
962cb174abaSMark A. Greer ret = trf7970a_mode_detect(trf, &trf->md_rf_tech);
963cb174abaSMark A. Greer if (ret) {
964cb174abaSMark A. Greer trf7970a_send_err_upstream(trf, ret);
965cb174abaSMark A. Greer } else {
966cb174abaSMark A. Greer trf->state = TRF7970A_ST_LISTENING;
967cb174abaSMark A. Greer trf7970a_drain_fifo(trf, status);
968cb174abaSMark A. Greer }
969cb174abaSMark A. Greer } else if (!(status & TRF7970A_IRQ_STATUS_NFC_RF)) {
970cb174abaSMark A. Greer trf7970a_send_err_upstream(trf, -EIO);
971cb174abaSMark A. Greer }
972cb174abaSMark A. Greer break;
973165063f1SMark A. Greer default:
974165063f1SMark A. Greer dev_err(trf->dev, "%s - Driver in invalid state: %d\n",
975165063f1SMark A. Greer __func__, trf->state);
976165063f1SMark A. Greer }
977165063f1SMark A. Greer
978b9e3016aSMark A. Greer err_unlock_exit:
979165063f1SMark A. Greer mutex_unlock(&trf->lock);
980165063f1SMark A. Greer return IRQ_HANDLED;
981165063f1SMark A. Greer }
982165063f1SMark A. Greer
trf7970a_issue_eof(struct trf7970a * trf)9839d9304b3SMark A. Greer static void trf7970a_issue_eof(struct trf7970a *trf)
9849d9304b3SMark A. Greer {
9859d9304b3SMark A. Greer int ret;
9869d9304b3SMark A. Greer
9879d9304b3SMark A. Greer dev_dbg(trf->dev, "Issuing EOF\n");
9889d9304b3SMark A. Greer
9899d9304b3SMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
9909d9304b3SMark A. Greer if (ret)
9919d9304b3SMark A. Greer trf7970a_send_err_upstream(trf, ret);
9929d9304b3SMark A. Greer
9939d9304b3SMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_EOF);
9949d9304b3SMark A. Greer if (ret)
9959d9304b3SMark A. Greer trf7970a_send_err_upstream(trf, ret);
9969d9304b3SMark A. Greer
9979d9304b3SMark A. Greer trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA;
9989d9304b3SMark A. Greer
9999d9304b3SMark A. Greer dev_dbg(trf->dev, "Setting timeout for %d ms, state: %d\n",
10009d9304b3SMark A. Greer trf->timeout, trf->state);
10019d9304b3SMark A. Greer
10029d9304b3SMark A. Greer schedule_delayed_work(&trf->timeout_work,
10039d9304b3SMark A. Greer msecs_to_jiffies(trf->timeout));
10049d9304b3SMark A. Greer }
10059d9304b3SMark A. Greer
trf7970a_timeout_work_handler(struct work_struct * work)1006165063f1SMark A. Greer static void trf7970a_timeout_work_handler(struct work_struct *work)
1007165063f1SMark A. Greer {
1008165063f1SMark A. Greer struct trf7970a *trf = container_of(work, struct trf7970a,
1009165063f1SMark A. Greer timeout_work.work);
1010165063f1SMark A. Greer
1011165063f1SMark A. Greer dev_dbg(trf->dev, "Timeout - state: %d, ignore_timeout: %d\n",
1012165063f1SMark A. Greer trf->state, trf->ignore_timeout);
1013165063f1SMark A. Greer
1014165063f1SMark A. Greer mutex_lock(&trf->lock);
1015165063f1SMark A. Greer
1016165063f1SMark A. Greer if (trf->ignore_timeout)
1017165063f1SMark A. Greer trf->ignore_timeout = false;
1018165063f1SMark A. Greer else if (trf->state == TRF7970A_ST_WAIT_FOR_RX_DATA_CONT)
1019afa5b5f1SMark A. Greer trf7970a_drain_fifo(trf, TRF7970A_IRQ_STATUS_SRX);
10209d9304b3SMark A. Greer else if (trf->state == TRF7970A_ST_WAIT_TO_ISSUE_EOF)
10219d9304b3SMark A. Greer trf7970a_issue_eof(trf);
1022165063f1SMark A. Greer else
1023165063f1SMark A. Greer trf7970a_send_err_upstream(trf, -ETIMEDOUT);
1024165063f1SMark A. Greer
1025165063f1SMark A. Greer mutex_unlock(&trf->lock);
1026165063f1SMark A. Greer }
1027165063f1SMark A. Greer
trf7970a_init(struct trf7970a * trf)1028165063f1SMark A. Greer static int trf7970a_init(struct trf7970a *trf)
1029165063f1SMark A. Greer {
1030165063f1SMark A. Greer int ret;
1031165063f1SMark A. Greer
1032165063f1SMark A. Greer dev_dbg(trf->dev, "Initializing device - state: %d\n", trf->state);
1033165063f1SMark A. Greer
1034165063f1SMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_SOFT_INIT);
1035165063f1SMark A. Greer if (ret)
1036165063f1SMark A. Greer goto err_out;
1037165063f1SMark A. Greer
1038165063f1SMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_IDLE);
1039165063f1SMark A. Greer if (ret)
1040165063f1SMark A. Greer goto err_out;
1041165063f1SMark A. Greer
104249d22c70SGeoff Lansberry ret = trf7970a_write(trf, TRF7970A_REG_IO_CTRL,
104349d22c70SGeoff Lansberry trf->io_ctrl | TRF7970A_REG_IO_CTRL_VRS(0x1));
104449d22c70SGeoff Lansberry if (ret)
104549d22c70SGeoff Lansberry goto err_out;
104649d22c70SGeoff Lansberry
104758d46f53SGeoff Lansberry ret = trf7970a_write(trf, TRF7970A_NFC_TARGET_LEVEL, 0);
104858d46f53SGeoff Lansberry if (ret)
104958d46f53SGeoff Lansberry goto err_out;
105058d46f53SGeoff Lansberry
10514e007f81SMark A. Greer usleep_range(1000, 2000);
10524e007f81SMark A. Greer
10537149d6bfSMark A. Greer trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON;
10547149d6bfSMark A. Greer
1055837eb4d2SGeoff Lansberry ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL,
1056837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl);
10576c08df42SMark A. Greer if (ret)
10586c08df42SMark A. Greer goto err_out;
10596c08df42SMark A. Greer
1060165063f1SMark A. Greer ret = trf7970a_write(trf, TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS,
1061165063f1SMark A. Greer TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 |
1062165063f1SMark A. Greer TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32);
1063165063f1SMark A. Greer if (ret)
1064165063f1SMark A. Greer goto err_out;
1065165063f1SMark A. Greer
1066165063f1SMark A. Greer ret = trf7970a_write(trf, TRF7970A_SPECIAL_FCN_REG1, 0);
1067165063f1SMark A. Greer if (ret)
1068165063f1SMark A. Greer goto err_out;
1069165063f1SMark A. Greer
1070165063f1SMark A. Greer trf->special_fcn_reg1 = 0;
1071165063f1SMark A. Greer
107249d19cc7SMark A. Greer trf->iso_ctrl = 0xff;
1073165063f1SMark A. Greer return 0;
1074165063f1SMark A. Greer
1075165063f1SMark A. Greer err_out:
1076165063f1SMark A. Greer dev_dbg(trf->dev, "Couldn't init device: %d\n", ret);
1077165063f1SMark A. Greer return ret;
1078165063f1SMark A. Greer }
1079165063f1SMark A. Greer
trf7970a_switch_rf_off(struct trf7970a * trf)1080165063f1SMark A. Greer static void trf7970a_switch_rf_off(struct trf7970a *trf)
1081165063f1SMark A. Greer {
1082cfc708dbSMark A. Greer if ((trf->state == TRF7970A_ST_PWR_OFF) ||
1083cfc708dbSMark A. Greer (trf->state == TRF7970A_ST_RF_OFF))
1084cfc708dbSMark A. Greer return;
1085cfc708dbSMark A. Greer
1086165063f1SMark A. Greer dev_dbg(trf->dev, "Switching rf off\n");
1087165063f1SMark A. Greer
1088a1d2dc5bSMark A. Greer trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON;
1089a1d2dc5bSMark A. Greer
1090a1d2dc5bSMark A. Greer trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL, trf->chip_status_ctrl);
1091a1d2dc5bSMark A. Greer
1092165063f1SMark A. Greer trf->aborting = false;
1093b5e17d9bSMark A. Greer trf->state = TRF7970A_ST_RF_OFF;
1094e6403b7cSMark A. Greer
1095e6403b7cSMark A. Greer pm_runtime_mark_last_busy(trf->dev);
1096e6403b7cSMark A. Greer pm_runtime_put_autosuspend(trf->dev);
1097165063f1SMark A. Greer }
1098165063f1SMark A. Greer
trf7970a_switch_rf_on(struct trf7970a * trf)10990a1de842SMark A. Greer static int trf7970a_switch_rf_on(struct trf7970a *trf)
1100165063f1SMark A. Greer {
1101a08e5454SMark A. Greer int ret;
1102a08e5454SMark A. Greer
1103165063f1SMark A. Greer dev_dbg(trf->dev, "Switching rf on\n");
1104165063f1SMark A. Greer
1105e6403b7cSMark A. Greer pm_runtime_get_sync(trf->dev);
1106165063f1SMark A. Greer
1107ceccd6aaSMark A. Greer if (trf->state != TRF7970A_ST_RF_OFF) { /* Power on, RF off */
1108ceccd6aaSMark A. Greer dev_err(trf->dev, "%s - Incorrect state: %d\n", __func__,
1109ceccd6aaSMark A. Greer trf->state);
1110ceccd6aaSMark A. Greer return -EINVAL;
1111ceccd6aaSMark A. Greer }
1112ceccd6aaSMark A. Greer
1113a08e5454SMark A. Greer ret = trf7970a_init(trf);
1114a08e5454SMark A. Greer if (ret) {
1115a08e5454SMark A. Greer dev_err(trf->dev, "%s - Can't initialize: %d\n", __func__, ret);
11160a1de842SMark A. Greer return ret;
1117a08e5454SMark A. Greer }
1118a08e5454SMark A. Greer
1119165063f1SMark A. Greer trf->state = TRF7970A_ST_IDLE;
11200a1de842SMark A. Greer
11210a1de842SMark A. Greer return 0;
1122165063f1SMark A. Greer }
1123165063f1SMark A. Greer
trf7970a_switch_rf(struct nfc_digital_dev * ddev,bool on)1124165063f1SMark A. Greer static int trf7970a_switch_rf(struct nfc_digital_dev *ddev, bool on)
1125165063f1SMark A. Greer {
1126165063f1SMark A. Greer struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
11270a1de842SMark A. Greer int ret = 0;
1128165063f1SMark A. Greer
1129165063f1SMark A. Greer dev_dbg(trf->dev, "Switching RF - state: %d, on: %d\n", trf->state, on);
1130165063f1SMark A. Greer
1131165063f1SMark A. Greer mutex_lock(&trf->lock);
1132165063f1SMark A. Greer
1133165063f1SMark A. Greer if (on) {
1134165063f1SMark A. Greer switch (trf->state) {
1135ceccd6aaSMark A. Greer case TRF7970A_ST_PWR_OFF:
1136b5e17d9bSMark A. Greer case TRF7970A_ST_RF_OFF:
11370a1de842SMark A. Greer ret = trf7970a_switch_rf_on(trf);
1138165063f1SMark A. Greer break;
1139165063f1SMark A. Greer case TRF7970A_ST_IDLE:
1140165063f1SMark A. Greer case TRF7970A_ST_IDLE_RX_BLOCKED:
1141165063f1SMark A. Greer break;
1142165063f1SMark A. Greer default:
1143165063f1SMark A. Greer dev_err(trf->dev, "%s - Invalid request: %d %d\n",
1144165063f1SMark A. Greer __func__, trf->state, on);
1145165063f1SMark A. Greer trf7970a_switch_rf_off(trf);
11460a1de842SMark A. Greer ret = -EINVAL;
1147165063f1SMark A. Greer }
1148165063f1SMark A. Greer } else {
1149165063f1SMark A. Greer switch (trf->state) {
1150ceccd6aaSMark A. Greer case TRF7970A_ST_PWR_OFF:
1151b5e17d9bSMark A. Greer case TRF7970A_ST_RF_OFF:
1152165063f1SMark A. Greer break;
1153165063f1SMark A. Greer default:
1154165063f1SMark A. Greer dev_err(trf->dev, "%s - Invalid request: %d %d\n",
1155165063f1SMark A. Greer __func__, trf->state, on);
11560a1de842SMark A. Greer ret = -EINVAL;
1157df561f66SGustavo A. R. Silva fallthrough;
1158165063f1SMark A. Greer case TRF7970A_ST_IDLE:
1159165063f1SMark A. Greer case TRF7970A_ST_IDLE_RX_BLOCKED:
116013b4272aSMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA:
116113b4272aSMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
1162165063f1SMark A. Greer trf7970a_switch_rf_off(trf);
1163165063f1SMark A. Greer }
1164165063f1SMark A. Greer }
1165165063f1SMark A. Greer
1166165063f1SMark A. Greer mutex_unlock(&trf->lock);
11670a1de842SMark A. Greer return ret;
1168165063f1SMark A. Greer }
1169165063f1SMark A. Greer
trf7970a_in_config_rf_tech(struct trf7970a * trf,int tech)1170307e5cafSMark A. Greer static int trf7970a_in_config_rf_tech(struct trf7970a *trf, int tech)
1171165063f1SMark A. Greer {
1172165063f1SMark A. Greer int ret = 0;
1173165063f1SMark A. Greer
1174165063f1SMark A. Greer dev_dbg(trf->dev, "rf technology: %d\n", tech);
1175165063f1SMark A. Greer
1176165063f1SMark A. Greer switch (tech) {
1177165063f1SMark A. Greer case NFC_DIGITAL_RF_TECH_106A:
117849d19cc7SMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
1179837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1180837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1181837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_OOK;
11824e64eff8SMark A. Greer trf->guard_time = TRF7970A_GUARD_TIME_NFCA;
1183165063f1SMark A. Greer break;
1184742b1f9fSMark A. Greer case NFC_DIGITAL_RF_TECH_106B:
1185742b1f9fSMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
1186837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1187837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1188837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_ASK10;
11894e64eff8SMark A. Greer trf->guard_time = TRF7970A_GUARD_TIME_NFCB;
1190742b1f9fSMark A. Greer break;
11916857bb96SMark A. Greer case NFC_DIGITAL_RF_TECH_212F:
11926857bb96SMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
1193837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1194837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1195837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_ASK10;
11964e64eff8SMark A. Greer trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
11976857bb96SMark A. Greer break;
11986857bb96SMark A. Greer case NFC_DIGITAL_RF_TECH_424F:
11996857bb96SMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
1200837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1201837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1202837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_ASK10;
12034e64eff8SMark A. Greer trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
12046857bb96SMark A. Greer break;
12059d9304b3SMark A. Greer case NFC_DIGITAL_RF_TECH_ISO15693:
120649d19cc7SMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
1207837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1208837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1209837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_OOK;
12104e64eff8SMark A. Greer trf->guard_time = TRF7970A_GUARD_TIME_15693;
12119d9304b3SMark A. Greer break;
1212165063f1SMark A. Greer default:
1213165063f1SMark A. Greer dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
1214165063f1SMark A. Greer return -EINVAL;
1215165063f1SMark A. Greer }
1216165063f1SMark A. Greer
1217165063f1SMark A. Greer trf->technology = tech;
1218165063f1SMark A. Greer
121913b4272aSMark A. Greer /* If in initiator mode and not changing the RF tech due to a
122013b4272aSMark A. Greer * PSL sequence (indicated by 'trf->iso_ctrl == 0xff' from
122113b4272aSMark A. Greer * trf7970a_init()), clear the NFC Target Detection Level register
122213b4272aSMark A. Greer * due to erratum.
122313b4272aSMark A. Greer */
122413b4272aSMark A. Greer if (trf->iso_ctrl == 0xff)
122513b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_NFC_TARGET_LEVEL, 0);
122613b4272aSMark A. Greer
1227165063f1SMark A. Greer return ret;
1228165063f1SMark A. Greer }
1229165063f1SMark A. Greer
trf7970a_is_rf_field(struct trf7970a * trf,bool * is_rf_field)1230851ee3cbSMark A. Greer static int trf7970a_is_rf_field(struct trf7970a *trf, bool *is_rf_field)
1231851ee3cbSMark A. Greer {
1232851ee3cbSMark A. Greer int ret;
1233851ee3cbSMark A. Greer u8 rssi;
1234851ee3cbSMark A. Greer
1235851ee3cbSMark A. Greer ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
1236e2f0f671SMark Greer trf->chip_status_ctrl |
1237e2f0f671SMark Greer TRF7970A_CHIP_STATUS_REC_ON);
1238851ee3cbSMark A. Greer if (ret)
1239851ee3cbSMark A. Greer return ret;
1240851ee3cbSMark A. Greer
1241851ee3cbSMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_TEST_EXT_RF);
1242851ee3cbSMark A. Greer if (ret)
1243851ee3cbSMark A. Greer return ret;
1244851ee3cbSMark A. Greer
1245851ee3cbSMark A. Greer usleep_range(50, 60);
1246851ee3cbSMark A. Greer
1247851ee3cbSMark A. Greer ret = trf7970a_read(trf, TRF7970A_RSSI_OSC_STATUS, &rssi);
1248851ee3cbSMark A. Greer if (ret)
1249851ee3cbSMark A. Greer return ret;
1250851ee3cbSMark A. Greer
1251851ee3cbSMark A. Greer ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
1252851ee3cbSMark A. Greer trf->chip_status_ctrl);
1253851ee3cbSMark A. Greer if (ret)
1254851ee3cbSMark A. Greer return ret;
1255851ee3cbSMark A. Greer
1256851ee3cbSMark A. Greer if (rssi & TRF7970A_RSSI_OSC_STATUS_RSSI_MASK)
1257851ee3cbSMark A. Greer *is_rf_field = true;
1258851ee3cbSMark A. Greer else
1259851ee3cbSMark A. Greer *is_rf_field = false;
1260851ee3cbSMark A. Greer
1261851ee3cbSMark A. Greer return 0;
1262851ee3cbSMark A. Greer }
1263851ee3cbSMark A. Greer
trf7970a_in_config_framing(struct trf7970a * trf,int framing)1264307e5cafSMark A. Greer static int trf7970a_in_config_framing(struct trf7970a *trf, int framing)
1265165063f1SMark A. Greer {
126649d19cc7SMark A. Greer u8 iso_ctrl = trf->iso_ctrl_tech;
1267851ee3cbSMark A. Greer bool is_rf_field = false;
126849d19cc7SMark A. Greer int ret;
126949d19cc7SMark A. Greer
1270165063f1SMark A. Greer dev_dbg(trf->dev, "framing: %d\n", framing);
1271165063f1SMark A. Greer
1272165063f1SMark A. Greer switch (framing) {
1273165063f1SMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_SHORT:
1274165063f1SMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_STANDARD:
1275165063f1SMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT_NO_CRC;
127649d19cc7SMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_RX_CRC_N;
1277165063f1SMark A. Greer break;
1278165063f1SMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A:
127980062891SMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_T4T:
1280742b1f9fSMark A. Greer case NFC_DIGITAL_FRAMING_NFCB:
1281742b1f9fSMark A. Greer case NFC_DIGITAL_FRAMING_NFCB_T4T:
12826857bb96SMark A. Greer case NFC_DIGITAL_FRAMING_NFCF:
12836857bb96SMark A. Greer case NFC_DIGITAL_FRAMING_NFCF_T3T:
12849d9304b3SMark A. Greer case NFC_DIGITAL_FRAMING_ISO15693_INVENTORY:
12859d9304b3SMark A. Greer case NFC_DIGITAL_FRAMING_ISO15693_T5T:
128613b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_NFC_DEP:
128713b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCF_NFC_DEP:
1288165063f1SMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
128949d19cc7SMark A. Greer iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
1290165063f1SMark A. Greer break;
1291165063f1SMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_T2T:
1292165063f1SMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
129349d19cc7SMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_RX_CRC_N;
1294165063f1SMark A. Greer break;
1295165063f1SMark A. Greer default:
1296165063f1SMark A. Greer dev_dbg(trf->dev, "Unsupported Framing: %d\n", framing);
1297165063f1SMark A. Greer return -EINVAL;
1298165063f1SMark A. Greer }
1299165063f1SMark A. Greer
1300165063f1SMark A. Greer trf->framing = framing;
1301165063f1SMark A. Greer
1302851ee3cbSMark A. Greer if (!(trf->chip_status_ctrl & TRF7970A_CHIP_STATUS_RF_ON)) {
1303851ee3cbSMark A. Greer ret = trf7970a_is_rf_field(trf, &is_rf_field);
1304851ee3cbSMark A. Greer if (ret)
1305851ee3cbSMark A. Greer return ret;
1306851ee3cbSMark A. Greer
1307851ee3cbSMark A. Greer if (is_rf_field)
1308851ee3cbSMark A. Greer return -EBUSY;
1309851ee3cbSMark A. Greer }
1310851ee3cbSMark A. Greer
131149d19cc7SMark A. Greer if (iso_ctrl != trf->iso_ctrl) {
131249d19cc7SMark A. Greer ret = trf7970a_write(trf, TRF7970A_ISO_CTRL, iso_ctrl);
131349d19cc7SMark A. Greer if (ret)
131449d19cc7SMark A. Greer return ret;
131549d19cc7SMark A. Greer
131649d19cc7SMark A. Greer trf->iso_ctrl = iso_ctrl;
1317a0822a7eSMark A. Greer
1318a0822a7eSMark A. Greer ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL,
131912e9ade3SMark A. Greer trf->modulator_sys_clk_ctrl);
1320a0822a7eSMark A. Greer if (ret)
1321a0822a7eSMark A. Greer return ret;
132249d19cc7SMark A. Greer }
132349d19cc7SMark A. Greer
1324a1d2dc5bSMark A. Greer if (!(trf->chip_status_ctrl & TRF7970A_CHIP_STATUS_RF_ON)) {
1325a1d2dc5bSMark A. Greer ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
1326a1d2dc5bSMark A. Greer trf->chip_status_ctrl |
1327a1d2dc5bSMark A. Greer TRF7970A_CHIP_STATUS_RF_ON);
1328a1d2dc5bSMark A. Greer if (ret)
1329a1d2dc5bSMark A. Greer return ret;
1330a1d2dc5bSMark A. Greer
1331a1d2dc5bSMark A. Greer trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
1332a1d2dc5bSMark A. Greer
13334e64eff8SMark A. Greer usleep_range(trf->guard_time, trf->guard_time + 1000);
1334a1d2dc5bSMark A. Greer }
1335a1d2dc5bSMark A. Greer
133649d19cc7SMark A. Greer return 0;
1337165063f1SMark A. Greer }
1338165063f1SMark A. Greer
trf7970a_in_configure_hw(struct nfc_digital_dev * ddev,int type,int param)1339165063f1SMark A. Greer static int trf7970a_in_configure_hw(struct nfc_digital_dev *ddev, int type,
1340165063f1SMark A. Greer int param)
1341165063f1SMark A. Greer {
1342165063f1SMark A. Greer struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
134318422e68SMark A. Greer int ret;
1344165063f1SMark A. Greer
1345165063f1SMark A. Greer dev_dbg(trf->dev, "Configure hw - type: %d, param: %d\n", type, param);
1346165063f1SMark A. Greer
1347165063f1SMark A. Greer mutex_lock(&trf->lock);
1348165063f1SMark A. Greer
134913b4272aSMark A. Greer trf->is_initiator = true;
135013b4272aSMark A. Greer
1351ceccd6aaSMark A. Greer if ((trf->state == TRF7970A_ST_PWR_OFF) ||
1352ceccd6aaSMark A. Greer (trf->state == TRF7970A_ST_RF_OFF)) {
13530a1de842SMark A. Greer ret = trf7970a_switch_rf_on(trf);
13540a1de842SMark A. Greer if (ret)
13550a1de842SMark A. Greer goto err_unlock;
13560a1de842SMark A. Greer }
1357165063f1SMark A. Greer
1358165063f1SMark A. Greer switch (type) {
1359165063f1SMark A. Greer case NFC_DIGITAL_CONFIG_RF_TECH:
1360307e5cafSMark A. Greer ret = trf7970a_in_config_rf_tech(trf, param);
1361165063f1SMark A. Greer break;
1362165063f1SMark A. Greer case NFC_DIGITAL_CONFIG_FRAMING:
1363307e5cafSMark A. Greer ret = trf7970a_in_config_framing(trf, param);
1364165063f1SMark A. Greer break;
1365165063f1SMark A. Greer default:
1366165063f1SMark A. Greer dev_dbg(trf->dev, "Unknown type: %d\n", type);
1367165063f1SMark A. Greer ret = -EINVAL;
1368165063f1SMark A. Greer }
1369165063f1SMark A. Greer
13700a1de842SMark A. Greer err_unlock:
1371165063f1SMark A. Greer mutex_unlock(&trf->lock);
1372165063f1SMark A. Greer return ret;
1373165063f1SMark A. Greer }
1374165063f1SMark A. Greer
trf7970a_is_iso15693_write_or_lock(u8 cmd)13759d9304b3SMark A. Greer static int trf7970a_is_iso15693_write_or_lock(u8 cmd)
13769d9304b3SMark A. Greer {
13779d9304b3SMark A. Greer switch (cmd) {
13789d9304b3SMark A. Greer case ISO15693_CMD_WRITE_SINGLE_BLOCK:
13799d9304b3SMark A. Greer case ISO15693_CMD_LOCK_BLOCK:
13809d9304b3SMark A. Greer case ISO15693_CMD_WRITE_MULTIPLE_BLOCK:
13819d9304b3SMark A. Greer case ISO15693_CMD_WRITE_AFI:
13829d9304b3SMark A. Greer case ISO15693_CMD_LOCK_AFI:
13839d9304b3SMark A. Greer case ISO15693_CMD_WRITE_DSFID:
13849d9304b3SMark A. Greer case ISO15693_CMD_LOCK_DSFID:
13859d9304b3SMark A. Greer return 1;
13869d9304b3SMark A. Greer default:
13879d9304b3SMark A. Greer return 0;
13889d9304b3SMark A. Greer }
13899d9304b3SMark A. Greer }
13909d9304b3SMark A. Greer
trf7970a_per_cmd_config(struct trf7970a * trf,const struct sk_buff * skb)1391ea050c5eSKrzysztof Kozlowski static int trf7970a_per_cmd_config(struct trf7970a *trf,
1392ea050c5eSKrzysztof Kozlowski const struct sk_buff *skb)
1393165063f1SMark A. Greer {
1394ea050c5eSKrzysztof Kozlowski const u8 *req = skb->data;
13959d9304b3SMark A. Greer u8 special_fcn_reg1, iso_ctrl;
1396165063f1SMark A. Greer int ret;
1397165063f1SMark A. Greer
13989d9304b3SMark A. Greer trf->issue_eof = false;
13999d9304b3SMark A. Greer
1400165063f1SMark A. Greer /* When issuing Type 2 read command, make sure the '4_bit_RX' bit in
1401165063f1SMark A. Greer * special functions register 1 is cleared; otherwise, its a write or
1402165063f1SMark A. Greer * sector select command and '4_bit_RX' must be set.
14039d9304b3SMark A. Greer *
14049d9304b3SMark A. Greer * When issuing an ISO 15693 command, inspect the flags byte to see
14059d9304b3SMark A. Greer * what speed to use. Also, remember if the OPTION flag is set on
14069d9304b3SMark A. Greer * a Type 5 write or lock command so the driver will know that it
14079d9304b3SMark A. Greer * has to send an EOF in order to get a response.
1408165063f1SMark A. Greer */
1409165063f1SMark A. Greer if ((trf->technology == NFC_DIGITAL_RF_TECH_106A) &&
1410165063f1SMark A. Greer (trf->framing == NFC_DIGITAL_FRAMING_NFCA_T2T)) {
1411165063f1SMark A. Greer if (req[0] == NFC_T2T_CMD_READ)
1412165063f1SMark A. Greer special_fcn_reg1 = 0;
1413165063f1SMark A. Greer else
1414165063f1SMark A. Greer special_fcn_reg1 = TRF7970A_SPECIAL_FCN_REG1_4_BIT_RX;
1415165063f1SMark A. Greer
1416165063f1SMark A. Greer if (special_fcn_reg1 != trf->special_fcn_reg1) {
1417165063f1SMark A. Greer ret = trf7970a_write(trf, TRF7970A_SPECIAL_FCN_REG1,
1418165063f1SMark A. Greer special_fcn_reg1);
1419165063f1SMark A. Greer if (ret)
1420165063f1SMark A. Greer return ret;
1421165063f1SMark A. Greer
1422165063f1SMark A. Greer trf->special_fcn_reg1 = special_fcn_reg1;
1423165063f1SMark A. Greer }
14249d9304b3SMark A. Greer } else if (trf->technology == NFC_DIGITAL_RF_TECH_ISO15693) {
14259d9304b3SMark A. Greer iso_ctrl = trf->iso_ctrl & ~TRF7970A_ISO_CTRL_RFID_SPEED_MASK;
14269d9304b3SMark A. Greer
14279d9304b3SMark A. Greer switch (req[0] & ISO15693_REQ_FLAG_SPEED_MASK) {
14289d9304b3SMark A. Greer case 0x00:
14299d9304b3SMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_15693_SGL_1OF4_662;
14309d9304b3SMark A. Greer break;
14319d9304b3SMark A. Greer case ISO15693_REQ_FLAG_SUB_CARRIER:
14329d9304b3SMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_15693_DBL_1OF4_667a;
14339d9304b3SMark A. Greer break;
14349d9304b3SMark A. Greer case ISO15693_REQ_FLAG_DATA_RATE:
14359d9304b3SMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
14369d9304b3SMark A. Greer break;
14379d9304b3SMark A. Greer case (ISO15693_REQ_FLAG_SUB_CARRIER |
14389d9304b3SMark A. Greer ISO15693_REQ_FLAG_DATA_RATE):
14399d9304b3SMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_15693_DBL_1OF4_2669;
14409d9304b3SMark A. Greer break;
14419d9304b3SMark A. Greer }
14429d9304b3SMark A. Greer
14439d9304b3SMark A. Greer if (iso_ctrl != trf->iso_ctrl) {
14449d9304b3SMark A. Greer ret = trf7970a_write(trf, TRF7970A_ISO_CTRL, iso_ctrl);
14459d9304b3SMark A. Greer if (ret)
14469d9304b3SMark A. Greer return ret;
14479d9304b3SMark A. Greer
14489d9304b3SMark A. Greer trf->iso_ctrl = iso_ctrl;
14499d9304b3SMark A. Greer }
14509d9304b3SMark A. Greer
1451a81d1ab3SMark Greer if ((trf->framing == NFC_DIGITAL_FRAMING_ISO15693_T5T) &&
1452a81d1ab3SMark Greer trf7970a_is_iso15693_write_or_lock(req[1]) &&
14539d9304b3SMark A. Greer (req[0] & ISO15693_REQ_FLAG_OPTION))
14549d9304b3SMark A. Greer trf->issue_eof = true;
1455165063f1SMark A. Greer }
1456165063f1SMark A. Greer
1457165063f1SMark A. Greer return 0;
1458165063f1SMark A. Greer }
1459165063f1SMark A. Greer
trf7970a_send_cmd(struct nfc_digital_dev * ddev,struct sk_buff * skb,u16 timeout,nfc_digital_cmd_complete_t cb,void * arg)146013b4272aSMark A. Greer static int trf7970a_send_cmd(struct nfc_digital_dev *ddev,
1461165063f1SMark A. Greer struct sk_buff *skb, u16 timeout,
1462165063f1SMark A. Greer nfc_digital_cmd_complete_t cb, void *arg)
1463165063f1SMark A. Greer {
1464165063f1SMark A. Greer struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
14657a1e5552SMark A. Greer u8 prefix[5];
1466165063f1SMark A. Greer unsigned int len;
1467165063f1SMark A. Greer int ret;
1468aff0564aSMark A. Greer u8 status;
1469165063f1SMark A. Greer
1470165063f1SMark A. Greer dev_dbg(trf->dev, "New request - state: %d, timeout: %d ms, len: %d\n",
1471165063f1SMark A. Greer trf->state, timeout, skb->len);
1472165063f1SMark A. Greer
1473165063f1SMark A. Greer if (skb->len > TRF7970A_TX_MAX)
1474165063f1SMark A. Greer return -EINVAL;
1475165063f1SMark A. Greer
1476165063f1SMark A. Greer mutex_lock(&trf->lock);
1477165063f1SMark A. Greer
1478165063f1SMark A. Greer if ((trf->state != TRF7970A_ST_IDLE) &&
1479165063f1SMark A. Greer (trf->state != TRF7970A_ST_IDLE_RX_BLOCKED)) {
1480165063f1SMark A. Greer dev_err(trf->dev, "%s - Bogus state: %d\n", __func__,
1481165063f1SMark A. Greer trf->state);
1482165063f1SMark A. Greer ret = -EIO;
1483165063f1SMark A. Greer goto out_err;
1484165063f1SMark A. Greer }
1485165063f1SMark A. Greer
1486165063f1SMark A. Greer if (trf->aborting) {
1487165063f1SMark A. Greer dev_dbg(trf->dev, "Abort process complete\n");
1488165063f1SMark A. Greer trf->aborting = false;
1489165063f1SMark A. Greer ret = -ECANCELED;
1490165063f1SMark A. Greer goto out_err;
1491165063f1SMark A. Greer }
1492165063f1SMark A. Greer
14931961843cSMark A. Greer if (timeout) {
1494165063f1SMark A. Greer trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE,
1495165063f1SMark A. Greer GFP_KERNEL);
1496165063f1SMark A. Greer if (!trf->rx_skb) {
1497165063f1SMark A. Greer dev_dbg(trf->dev, "Can't alloc rx_skb\n");
1498165063f1SMark A. Greer ret = -ENOMEM;
1499165063f1SMark A. Greer goto out_err;
1500165063f1SMark A. Greer }
15011961843cSMark A. Greer }
1502165063f1SMark A. Greer
1503165063f1SMark A. Greer if (trf->state == TRF7970A_ST_IDLE_RX_BLOCKED) {
1504165063f1SMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_ENABLE_RX);
1505165063f1SMark A. Greer if (ret)
1506165063f1SMark A. Greer goto out_err;
1507165063f1SMark A. Greer
1508165063f1SMark A. Greer trf->state = TRF7970A_ST_IDLE;
1509165063f1SMark A. Greer }
1510165063f1SMark A. Greer
151113b4272aSMark A. Greer if (trf->is_initiator) {
1512165063f1SMark A. Greer ret = trf7970a_per_cmd_config(trf, skb);
1513165063f1SMark A. Greer if (ret)
1514165063f1SMark A. Greer goto out_err;
151513b4272aSMark A. Greer }
1516165063f1SMark A. Greer
1517165063f1SMark A. Greer trf->ddev = ddev;
1518165063f1SMark A. Greer trf->tx_skb = skb;
1519165063f1SMark A. Greer trf->cb = cb;
1520165063f1SMark A. Greer trf->cb_arg = arg;
1521165063f1SMark A. Greer trf->timeout = timeout;
1522165063f1SMark A. Greer trf->ignore_timeout = false;
1523165063f1SMark A. Greer
1524165063f1SMark A. Greer len = skb->len;
1525165063f1SMark A. Greer
1526165063f1SMark A. Greer /* TX data must be prefixed with a FIFO reset cmd, a cmd that depends
1527165063f1SMark A. Greer * on what the current framing is, the address of the TX length byte 1
1528165063f1SMark A. Greer * register (0x1d), and the 2 byte length of the data to be transmitted.
15297a1e5552SMark A. Greer * That totals 5 bytes.
1530165063f1SMark A. Greer */
1531165063f1SMark A. Greer prefix[0] = TRF7970A_CMD_BIT_CTRL |
1532165063f1SMark A. Greer TRF7970A_CMD_BIT_OPCODE(TRF7970A_CMD_FIFO_RESET);
1533165063f1SMark A. Greer prefix[1] = TRF7970A_CMD_BIT_CTRL |
1534165063f1SMark A. Greer TRF7970A_CMD_BIT_OPCODE(trf->tx_cmd);
1535165063f1SMark A. Greer prefix[2] = TRF7970A_CMD_BIT_CONTINUOUS | TRF7970A_TX_LENGTH_BYTE1;
1536165063f1SMark A. Greer
1537165063f1SMark A. Greer if (trf->framing == NFC_DIGITAL_FRAMING_NFCA_SHORT) {
1538165063f1SMark A. Greer prefix[3] = 0x00;
1539165063f1SMark A. Greer prefix[4] = 0x0f; /* 7 bits */
1540165063f1SMark A. Greer } else {
1541165063f1SMark A. Greer prefix[3] = (len & 0xf00) >> 4;
1542165063f1SMark A. Greer prefix[3] |= ((len & 0xf0) >> 4);
1543165063f1SMark A. Greer prefix[4] = ((len & 0x0f) << 4);
1544165063f1SMark A. Greer }
1545165063f1SMark A. Greer
1546165063f1SMark A. Greer len = min_t(int, skb->len, TRF7970A_FIFO_SIZE);
1547165063f1SMark A. Greer
1548aff0564aSMark A. Greer /* Clear possible spurious interrupt */
1549aff0564aSMark A. Greer ret = trf7970a_read_irqstatus(trf, &status);
1550aff0564aSMark A. Greer if (ret)
1551aff0564aSMark A. Greer goto out_err;
1552aff0564aSMark A. Greer
15537a1e5552SMark A. Greer ret = trf7970a_transmit(trf, skb, len, prefix, sizeof(prefix));
1554165063f1SMark A. Greer if (ret) {
1555165063f1SMark A. Greer kfree_skb(trf->rx_skb);
1556165063f1SMark A. Greer trf->rx_skb = NULL;
1557165063f1SMark A. Greer }
1558165063f1SMark A. Greer
1559165063f1SMark A. Greer out_err:
1560165063f1SMark A. Greer mutex_unlock(&trf->lock);
1561165063f1SMark A. Greer return ret;
1562165063f1SMark A. Greer }
1563165063f1SMark A. Greer
trf7970a_tg_config_rf_tech(struct trf7970a * trf,int tech)156413b4272aSMark A. Greer static int trf7970a_tg_config_rf_tech(struct trf7970a *trf, int tech)
1565165063f1SMark A. Greer {
156613b4272aSMark A. Greer int ret = 0;
1567165063f1SMark A. Greer
156813b4272aSMark A. Greer dev_dbg(trf->dev, "rf technology: %d\n", tech);
1569165063f1SMark A. Greer
157013b4272aSMark A. Greer switch (tech) {
157113b4272aSMark A. Greer case NFC_DIGITAL_RF_TECH_106A:
157213b4272aSMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
1573e2f0f671SMark Greer TRF7970A_ISO_CTRL_NFC_CE | TRF7970A_ISO_CTRL_NFC_CE_14443A;
1574837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1575837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1576837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_OOK;
157713b4272aSMark A. Greer break;
157813b4272aSMark A. Greer case NFC_DIGITAL_RF_TECH_212F:
157913b4272aSMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
158013b4272aSMark A. Greer TRF7970A_ISO_CTRL_NFC_NFCF_212;
1581837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1582837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1583837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_ASK10;
158413b4272aSMark A. Greer break;
158513b4272aSMark A. Greer case NFC_DIGITAL_RF_TECH_424F:
158613b4272aSMark A. Greer trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
158713b4272aSMark A. Greer TRF7970A_ISO_CTRL_NFC_NFCF_424;
1588837eb4d2SGeoff Lansberry trf->modulator_sys_clk_ctrl =
1589837eb4d2SGeoff Lansberry (trf->modulator_sys_clk_ctrl & 0xf8) |
1590837eb4d2SGeoff Lansberry TRF7970A_MODULATOR_DEPTH_ASK10;
159113b4272aSMark A. Greer break;
159213b4272aSMark A. Greer default:
159313b4272aSMark A. Greer dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
1594165063f1SMark A. Greer return -EINVAL;
1595165063f1SMark A. Greer }
1596165063f1SMark A. Greer
159713b4272aSMark A. Greer trf->technology = tech;
159813b4272aSMark A. Greer
159913b4272aSMark A. Greer /* Normally we write the ISO_CTRL register in
160013b4272aSMark A. Greer * trf7970a_tg_config_framing() because the framing can change
160113b4272aSMark A. Greer * the value written. However, when sending a PSL RES,
160213b4272aSMark A. Greer * digital_tg_send_psl_res_complete() doesn't call
160313b4272aSMark A. Greer * trf7970a_tg_config_framing() so we must write the register
160413b4272aSMark A. Greer * here.
160513b4272aSMark A. Greer */
160613b4272aSMark A. Greer if ((trf->framing == NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED) &&
160713b4272aSMark A. Greer (trf->iso_ctrl_tech != trf->iso_ctrl)) {
160813b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_ISO_CTRL,
160913b4272aSMark A. Greer trf->iso_ctrl_tech);
161013b4272aSMark A. Greer
161113b4272aSMark A. Greer trf->iso_ctrl = trf->iso_ctrl_tech;
161213b4272aSMark A. Greer }
161313b4272aSMark A. Greer
161413b4272aSMark A. Greer return ret;
161513b4272aSMark A. Greer }
161613b4272aSMark A. Greer
161713b4272aSMark A. Greer /* Since this is a target routine, several of the framing calls are
161813b4272aSMark A. Greer * made between receiving the request and sending the response so they
161913b4272aSMark A. Greer * should take effect until after the response is sent. This is accomplished
162013b4272aSMark A. Greer * by skipping the ISO_CTRL register write here and doing it in the interrupt
162113b4272aSMark A. Greer * handler.
162213b4272aSMark A. Greer */
trf7970a_tg_config_framing(struct trf7970a * trf,int framing)162313b4272aSMark A. Greer static int trf7970a_tg_config_framing(struct trf7970a *trf, int framing)
162413b4272aSMark A. Greer {
162513b4272aSMark A. Greer u8 iso_ctrl = trf->iso_ctrl_tech;
162613b4272aSMark A. Greer int ret;
162713b4272aSMark A. Greer
162813b4272aSMark A. Greer dev_dbg(trf->dev, "framing: %d\n", framing);
162913b4272aSMark A. Greer
163013b4272aSMark A. Greer switch (framing) {
163113b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_NFC_DEP:
163213b4272aSMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT_NO_CRC;
163313b4272aSMark A. Greer iso_ctrl |= TRF7970A_ISO_CTRL_RX_CRC_N;
163413b4272aSMark A. Greer break;
163513b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_STANDARD:
163613b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A:
163713b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE:
163813b4272aSMark A. Greer /* These ones are applied in the interrupt handler */
163913b4272aSMark A. Greer iso_ctrl = trf->iso_ctrl; /* Don't write to ISO_CTRL yet */
164013b4272aSMark A. Greer break;
164113b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFCF_NFC_DEP:
164213b4272aSMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
164313b4272aSMark A. Greer iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
164413b4272aSMark A. Greer break;
164513b4272aSMark A. Greer case NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED:
164613b4272aSMark A. Greer trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
164713b4272aSMark A. Greer iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
164813b4272aSMark A. Greer break;
164913b4272aSMark A. Greer default:
165013b4272aSMark A. Greer dev_dbg(trf->dev, "Unsupported Framing: %d\n", framing);
165113b4272aSMark A. Greer return -EINVAL;
165213b4272aSMark A. Greer }
165313b4272aSMark A. Greer
165413b4272aSMark A. Greer trf->framing = framing;
165513b4272aSMark A. Greer
165613b4272aSMark A. Greer if (iso_ctrl != trf->iso_ctrl) {
165713b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_ISO_CTRL, iso_ctrl);
165813b4272aSMark A. Greer if (ret)
165913b4272aSMark A. Greer return ret;
166013b4272aSMark A. Greer
166113b4272aSMark A. Greer trf->iso_ctrl = iso_ctrl;
166213b4272aSMark A. Greer
166313b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL,
166413b4272aSMark A. Greer trf->modulator_sys_clk_ctrl);
166513b4272aSMark A. Greer if (ret)
166613b4272aSMark A. Greer return ret;
166713b4272aSMark A. Greer }
166813b4272aSMark A. Greer
166913b4272aSMark A. Greer if (!(trf->chip_status_ctrl & TRF7970A_CHIP_STATUS_RF_ON)) {
167013b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
167113b4272aSMark A. Greer trf->chip_status_ctrl |
167213b4272aSMark A. Greer TRF7970A_CHIP_STATUS_RF_ON);
167313b4272aSMark A. Greer if (ret)
167413b4272aSMark A. Greer return ret;
167513b4272aSMark A. Greer
167613b4272aSMark A. Greer trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
167713b4272aSMark A. Greer }
167813b4272aSMark A. Greer
167913b4272aSMark A. Greer return 0;
168013b4272aSMark A. Greer }
168113b4272aSMark A. Greer
trf7970a_tg_configure_hw(struct nfc_digital_dev * ddev,int type,int param)168213b4272aSMark A. Greer static int trf7970a_tg_configure_hw(struct nfc_digital_dev *ddev, int type,
168313b4272aSMark A. Greer int param)
168413b4272aSMark A. Greer {
168513b4272aSMark A. Greer struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
168613b4272aSMark A. Greer int ret;
168713b4272aSMark A. Greer
168813b4272aSMark A. Greer dev_dbg(trf->dev, "Configure hw - type: %d, param: %d\n", type, param);
168913b4272aSMark A. Greer
169013b4272aSMark A. Greer mutex_lock(&trf->lock);
169113b4272aSMark A. Greer
169213b4272aSMark A. Greer trf->is_initiator = false;
169313b4272aSMark A. Greer
169413b4272aSMark A. Greer if ((trf->state == TRF7970A_ST_PWR_OFF) ||
169513b4272aSMark A. Greer (trf->state == TRF7970A_ST_RF_OFF)) {
169613b4272aSMark A. Greer ret = trf7970a_switch_rf_on(trf);
169713b4272aSMark A. Greer if (ret)
169813b4272aSMark A. Greer goto err_unlock;
169913b4272aSMark A. Greer }
170013b4272aSMark A. Greer
170113b4272aSMark A. Greer switch (type) {
170213b4272aSMark A. Greer case NFC_DIGITAL_CONFIG_RF_TECH:
170313b4272aSMark A. Greer ret = trf7970a_tg_config_rf_tech(trf, param);
170413b4272aSMark A. Greer break;
170513b4272aSMark A. Greer case NFC_DIGITAL_CONFIG_FRAMING:
170613b4272aSMark A. Greer ret = trf7970a_tg_config_framing(trf, param);
170713b4272aSMark A. Greer break;
170813b4272aSMark A. Greer default:
170913b4272aSMark A. Greer dev_dbg(trf->dev, "Unknown type: %d\n", type);
171013b4272aSMark A. Greer ret = -EINVAL;
171113b4272aSMark A. Greer }
171213b4272aSMark A. Greer
171313b4272aSMark A. Greer err_unlock:
171413b4272aSMark A. Greer mutex_unlock(&trf->lock);
171513b4272aSMark A. Greer return ret;
171613b4272aSMark A. Greer }
171713b4272aSMark A. Greer
_trf7970a_tg_listen(struct nfc_digital_dev * ddev,u16 timeout,nfc_digital_cmd_complete_t cb,void * arg,bool mode_detect)1718cb174abaSMark A. Greer static int _trf7970a_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
1719e2f0f671SMark Greer nfc_digital_cmd_complete_t cb, void *arg,
1720e2f0f671SMark Greer bool mode_detect)
1721165063f1SMark A. Greer {
1722165063f1SMark A. Greer struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
172313b4272aSMark A. Greer int ret;
1724165063f1SMark A. Greer
172513b4272aSMark A. Greer mutex_lock(&trf->lock);
172613b4272aSMark A. Greer
172713b4272aSMark A. Greer if ((trf->state != TRF7970A_ST_IDLE) &&
172813b4272aSMark A. Greer (trf->state != TRF7970A_ST_IDLE_RX_BLOCKED)) {
172913b4272aSMark A. Greer dev_err(trf->dev, "%s - Bogus state: %d\n", __func__,
173013b4272aSMark A. Greer trf->state);
173113b4272aSMark A. Greer ret = -EIO;
173213b4272aSMark A. Greer goto out_err;
1733165063f1SMark A. Greer }
1734165063f1SMark A. Greer
173513b4272aSMark A. Greer if (trf->aborting) {
173613b4272aSMark A. Greer dev_dbg(trf->dev, "Abort process complete\n");
173713b4272aSMark A. Greer trf->aborting = false;
173813b4272aSMark A. Greer ret = -ECANCELED;
173913b4272aSMark A. Greer goto out_err;
174013b4272aSMark A. Greer }
1741165063f1SMark A. Greer
174213b4272aSMark A. Greer trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE,
174313b4272aSMark A. Greer GFP_KERNEL);
174413b4272aSMark A. Greer if (!trf->rx_skb) {
174513b4272aSMark A. Greer dev_dbg(trf->dev, "Can't alloc rx_skb\n");
174613b4272aSMark A. Greer ret = -ENOMEM;
174713b4272aSMark A. Greer goto out_err;
174813b4272aSMark A. Greer }
1749165063f1SMark A. Greer
175013b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_RX_SPECIAL_SETTINGS,
175113b4272aSMark A. Greer TRF7970A_RX_SPECIAL_SETTINGS_HBT |
175213b4272aSMark A. Greer TRF7970A_RX_SPECIAL_SETTINGS_M848 |
175313b4272aSMark A. Greer TRF7970A_RX_SPECIAL_SETTINGS_C424 |
175413b4272aSMark A. Greer TRF7970A_RX_SPECIAL_SETTINGS_C212);
175513b4272aSMark A. Greer if (ret)
1756fc0ae243SMark A. Greer goto out_err;
175713b4272aSMark A. Greer
175813b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_REG_IO_CTRL,
175949d22c70SGeoff Lansberry trf->io_ctrl | TRF7970A_REG_IO_CTRL_VRS(0x1));
176013b4272aSMark A. Greer if (ret)
1761fc0ae243SMark A. Greer goto out_err;
176213b4272aSMark A. Greer
176313b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_NFC_LOW_FIELD_LEVEL,
176413b4272aSMark A. Greer TRF7970A_NFC_LOW_FIELD_LEVEL_RFDET(0x3));
176513b4272aSMark A. Greer if (ret)
1766fc0ae243SMark A. Greer goto out_err;
176713b4272aSMark A. Greer
176813b4272aSMark A. Greer ret = trf7970a_write(trf, TRF7970A_NFC_TARGET_LEVEL,
176913b4272aSMark A. Greer TRF7970A_NFC_TARGET_LEVEL_RFDET(0x7));
177013b4272aSMark A. Greer if (ret)
1771fc0ae243SMark A. Greer goto out_err;
177213b4272aSMark A. Greer
177313b4272aSMark A. Greer trf->ddev = ddev;
177413b4272aSMark A. Greer trf->cb = cb;
177513b4272aSMark A. Greer trf->cb_arg = arg;
177613b4272aSMark A. Greer trf->timeout = timeout;
177713b4272aSMark A. Greer trf->ignore_timeout = false;
177813b4272aSMark A. Greer
177913b4272aSMark A. Greer ret = trf7970a_cmd(trf, TRF7970A_CMD_ENABLE_RX);
178013b4272aSMark A. Greer if (ret)
178113b4272aSMark A. Greer goto out_err;
178213b4272aSMark A. Greer
1783cb174abaSMark A. Greer trf->state = mode_detect ? TRF7970A_ST_LISTENING_MD :
1784cb174abaSMark A. Greer TRF7970A_ST_LISTENING;
178513b4272aSMark A. Greer
178613b4272aSMark A. Greer schedule_delayed_work(&trf->timeout_work, msecs_to_jiffies(timeout));
178713b4272aSMark A. Greer
178813b4272aSMark A. Greer out_err:
178913b4272aSMark A. Greer mutex_unlock(&trf->lock);
179013b4272aSMark A. Greer return ret;
1791165063f1SMark A. Greer }
1792165063f1SMark A. Greer
trf7970a_tg_listen(struct nfc_digital_dev * ddev,u16 timeout,nfc_digital_cmd_complete_t cb,void * arg)1793cb174abaSMark A. Greer static int trf7970a_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
1794cb174abaSMark A. Greer nfc_digital_cmd_complete_t cb, void *arg)
1795cb174abaSMark A. Greer {
1796ea050c5eSKrzysztof Kozlowski const struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1797cb174abaSMark A. Greer
1798cb174abaSMark A. Greer dev_dbg(trf->dev, "Listen - state: %d, timeout: %d ms\n",
1799cb174abaSMark A. Greer trf->state, timeout);
1800cb174abaSMark A. Greer
1801cb174abaSMark A. Greer return _trf7970a_tg_listen(ddev, timeout, cb, arg, false);
1802cb174abaSMark A. Greer }
1803cb174abaSMark A. Greer
trf7970a_tg_listen_md(struct nfc_digital_dev * ddev,u16 timeout,nfc_digital_cmd_complete_t cb,void * arg)1804cb174abaSMark A. Greer static int trf7970a_tg_listen_md(struct nfc_digital_dev *ddev,
1805e2f0f671SMark Greer u16 timeout, nfc_digital_cmd_complete_t cb,
1806e2f0f671SMark Greer void *arg)
1807cb174abaSMark A. Greer {
1808ea050c5eSKrzysztof Kozlowski const struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1809cb174abaSMark A. Greer int ret;
1810cb174abaSMark A. Greer
1811cb174abaSMark A. Greer dev_dbg(trf->dev, "Listen MD - state: %d, timeout: %d ms\n",
1812cb174abaSMark A. Greer trf->state, timeout);
1813cb174abaSMark A. Greer
1814cb174abaSMark A. Greer ret = trf7970a_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
1815cb174abaSMark A. Greer NFC_DIGITAL_RF_TECH_106A);
1816cb174abaSMark A. Greer if (ret)
1817cb174abaSMark A. Greer return ret;
1818cb174abaSMark A. Greer
1819cb174abaSMark A. Greer ret = trf7970a_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
1820cb174abaSMark A. Greer NFC_DIGITAL_FRAMING_NFCA_NFC_DEP);
1821cb174abaSMark A. Greer if (ret)
1822cb174abaSMark A. Greer return ret;
1823cb174abaSMark A. Greer
1824cb174abaSMark A. Greer return _trf7970a_tg_listen(ddev, timeout, cb, arg, true);
1825cb174abaSMark A. Greer }
1826cb174abaSMark A. Greer
trf7970a_tg_get_rf_tech(struct nfc_digital_dev * ddev,u8 * rf_tech)1827cb174abaSMark A. Greer static int trf7970a_tg_get_rf_tech(struct nfc_digital_dev *ddev, u8 *rf_tech)
1828cb174abaSMark A. Greer {
1829ea050c5eSKrzysztof Kozlowski const struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1830cb174abaSMark A. Greer
1831cb174abaSMark A. Greer dev_dbg(trf->dev, "Get RF Tech - state: %d, rf_tech: %d\n",
1832cb174abaSMark A. Greer trf->state, trf->md_rf_tech);
1833cb174abaSMark A. Greer
1834cb174abaSMark A. Greer *rf_tech = trf->md_rf_tech;
1835cb174abaSMark A. Greer
1836cb174abaSMark A. Greer return 0;
1837cb174abaSMark A. Greer }
1838cb174abaSMark A. Greer
trf7970a_abort_cmd(struct nfc_digital_dev * ddev)1839165063f1SMark A. Greer static void trf7970a_abort_cmd(struct nfc_digital_dev *ddev)
1840165063f1SMark A. Greer {
1841165063f1SMark A. Greer struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1842165063f1SMark A. Greer
1843165063f1SMark A. Greer dev_dbg(trf->dev, "Abort process initiated\n");
1844165063f1SMark A. Greer
1845165063f1SMark A. Greer mutex_lock(&trf->lock);
18465876bc75SMark A. Greer
18475876bc75SMark A. Greer switch (trf->state) {
18485876bc75SMark A. Greer case TRF7970A_ST_WAIT_FOR_TX_FIFO:
18495876bc75SMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA:
18505876bc75SMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
18515876bc75SMark A. Greer case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
1852165063f1SMark A. Greer trf->aborting = true;
18535876bc75SMark A. Greer break;
185413b4272aSMark A. Greer case TRF7970A_ST_LISTENING:
185513b4272aSMark A. Greer trf->ignore_timeout = !cancel_delayed_work(&trf->timeout_work);
185613b4272aSMark A. Greer trf7970a_send_err_upstream(trf, -ECANCELED);
185713b4272aSMark A. Greer dev_dbg(trf->dev, "Abort process complete\n");
185813b4272aSMark A. Greer break;
18595876bc75SMark A. Greer default:
18605876bc75SMark A. Greer break;
18615876bc75SMark A. Greer }
18625876bc75SMark A. Greer
1863165063f1SMark A. Greer mutex_unlock(&trf->lock);
1864165063f1SMark A. Greer }
1865165063f1SMark A. Greer
18667186aac9SKrzysztof Kozlowski static const struct nfc_digital_ops trf7970a_nfc_ops = {
1867165063f1SMark A. Greer .in_configure_hw = trf7970a_in_configure_hw,
186813b4272aSMark A. Greer .in_send_cmd = trf7970a_send_cmd,
1869165063f1SMark A. Greer .tg_configure_hw = trf7970a_tg_configure_hw,
187013b4272aSMark A. Greer .tg_send_cmd = trf7970a_send_cmd,
1871165063f1SMark A. Greer .tg_listen = trf7970a_tg_listen,
1872cb174abaSMark A. Greer .tg_listen_md = trf7970a_tg_listen_md,
1873cb174abaSMark A. Greer .tg_get_rf_tech = trf7970a_tg_get_rf_tech,
1874165063f1SMark A. Greer .switch_rf = trf7970a_switch_rf,
1875165063f1SMark A. Greer .abort_cmd = trf7970a_abort_cmd,
1876165063f1SMark A. Greer };
1877165063f1SMark A. Greer
trf7970a_power_up(struct trf7970a * trf)1878ceccd6aaSMark A. Greer static int trf7970a_power_up(struct trf7970a *trf)
1879ceccd6aaSMark A. Greer {
1880ceccd6aaSMark A. Greer int ret;
1881ceccd6aaSMark A. Greer
1882ceccd6aaSMark A. Greer dev_dbg(trf->dev, "Powering up - state: %d\n", trf->state);
1883ceccd6aaSMark A. Greer
1884ceccd6aaSMark A. Greer if (trf->state != TRF7970A_ST_PWR_OFF)
1885ceccd6aaSMark A. Greer return 0;
1886ceccd6aaSMark A. Greer
1887*cffee39dSPaul Geurts ret = regulator_enable(trf->vin_regulator);
1888ceccd6aaSMark A. Greer if (ret) {
1889ceccd6aaSMark A. Greer dev_err(trf->dev, "%s - Can't enable VIN: %d\n", __func__, ret);
1890ceccd6aaSMark A. Greer return ret;
1891ceccd6aaSMark A. Greer }
1892ceccd6aaSMark A. Greer
1893ceccd6aaSMark A. Greer usleep_range(5000, 6000);
1894ceccd6aaSMark A. Greer
1895d34e48d6SMark Greer if (trf->en2_gpiod &&
1896d34e48d6SMark Greer !(trf->quirks & TRF7970A_QUIRK_EN2_MUST_STAY_LOW)) {
1897d34e48d6SMark Greer gpiod_set_value_cansleep(trf->en2_gpiod, 1);
1898ceccd6aaSMark A. Greer usleep_range(1000, 2000);
1899ceccd6aaSMark A. Greer }
1900ceccd6aaSMark A. Greer
1901d34e48d6SMark Greer gpiod_set_value_cansleep(trf->en_gpiod, 1);
1902ceccd6aaSMark A. Greer
1903ceccd6aaSMark A. Greer usleep_range(20000, 21000);
1904ceccd6aaSMark A. Greer
1905ceccd6aaSMark A. Greer trf->state = TRF7970A_ST_RF_OFF;
1906ceccd6aaSMark A. Greer
1907ceccd6aaSMark A. Greer return 0;
1908ceccd6aaSMark A. Greer }
1909ceccd6aaSMark A. Greer
trf7970a_power_down(struct trf7970a * trf)1910ceccd6aaSMark A. Greer static int trf7970a_power_down(struct trf7970a *trf)
1911ceccd6aaSMark A. Greer {
1912ceccd6aaSMark A. Greer int ret;
1913ceccd6aaSMark A. Greer
1914ceccd6aaSMark A. Greer dev_dbg(trf->dev, "Powering down - state: %d\n", trf->state);
1915ceccd6aaSMark A. Greer
1916ceccd6aaSMark A. Greer if (trf->state == TRF7970A_ST_PWR_OFF)
1917ceccd6aaSMark A. Greer return 0;
1918ceccd6aaSMark A. Greer
1919ceccd6aaSMark A. Greer if (trf->state != TRF7970A_ST_RF_OFF) {
1920ceccd6aaSMark A. Greer dev_dbg(trf->dev, "Can't power down - not RF_OFF state (%d)\n",
1921ceccd6aaSMark A. Greer trf->state);
1922ceccd6aaSMark A. Greer return -EBUSY;
1923ceccd6aaSMark A. Greer }
1924ceccd6aaSMark A. Greer
1925d34e48d6SMark Greer gpiod_set_value_cansleep(trf->en_gpiod, 0);
192667dec192SMark Greer
1927e2f0f671SMark Greer if (trf->en2_gpiod && !(trf->quirks & TRF7970A_QUIRK_EN2_MUST_STAY_LOW))
1928d34e48d6SMark Greer gpiod_set_value_cansleep(trf->en2_gpiod, 0);
1929ceccd6aaSMark A. Greer
1930*cffee39dSPaul Geurts ret = regulator_disable(trf->vin_regulator);
1931ceccd6aaSMark A. Greer if (ret)
1932ceccd6aaSMark A. Greer dev_err(trf->dev, "%s - Can't disable VIN: %d\n", __func__,
1933ceccd6aaSMark A. Greer ret);
1934ceccd6aaSMark A. Greer
1935ceccd6aaSMark A. Greer trf->state = TRF7970A_ST_PWR_OFF;
1936ceccd6aaSMark A. Greer
1937ceccd6aaSMark A. Greer return ret;
1938ceccd6aaSMark A. Greer }
1939ceccd6aaSMark A. Greer
trf7970a_startup(struct trf7970a * trf)1940b528281bSMark A. Greer static int trf7970a_startup(struct trf7970a *trf)
1941b528281bSMark A. Greer {
1942b528281bSMark A. Greer int ret;
1943b528281bSMark A. Greer
1944b528281bSMark A. Greer ret = trf7970a_power_up(trf);
1945b528281bSMark A. Greer if (ret)
1946b528281bSMark A. Greer return ret;
1947b528281bSMark A. Greer
1948b528281bSMark A. Greer pm_runtime_set_active(trf->dev);
1949b528281bSMark A. Greer pm_runtime_enable(trf->dev);
1950b528281bSMark A. Greer pm_runtime_mark_last_busy(trf->dev);
1951b528281bSMark A. Greer
1952b528281bSMark A. Greer return 0;
1953b528281bSMark A. Greer }
1954b528281bSMark A. Greer
trf7970a_shutdown(struct trf7970a * trf)1955b528281bSMark A. Greer static void trf7970a_shutdown(struct trf7970a *trf)
1956b528281bSMark A. Greer {
1957b528281bSMark A. Greer switch (trf->state) {
1958b528281bSMark A. Greer case TRF7970A_ST_WAIT_FOR_TX_FIFO:
1959b528281bSMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA:
1960b528281bSMark A. Greer case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
1961b528281bSMark A. Greer case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
196213b4272aSMark A. Greer case TRF7970A_ST_LISTENING:
1963b528281bSMark A. Greer trf7970a_send_err_upstream(trf, -ECANCELED);
1964df561f66SGustavo A. R. Silva fallthrough;
1965b528281bSMark A. Greer case TRF7970A_ST_IDLE:
1966b528281bSMark A. Greer case TRF7970A_ST_IDLE_RX_BLOCKED:
1967b528281bSMark A. Greer trf7970a_switch_rf_off(trf);
1968b528281bSMark A. Greer break;
1969b528281bSMark A. Greer default:
1970b528281bSMark A. Greer break;
1971b528281bSMark A. Greer }
1972b528281bSMark A. Greer
1973b528281bSMark A. Greer pm_runtime_disable(trf->dev);
1974b528281bSMark A. Greer pm_runtime_set_suspended(trf->dev);
1975b528281bSMark A. Greer
1976b528281bSMark A. Greer trf7970a_power_down(trf);
1977b528281bSMark A. Greer }
1978b528281bSMark A. Greer
trf7970a_get_autosuspend_delay(const struct device_node * np)1979ea050c5eSKrzysztof Kozlowski static int trf7970a_get_autosuspend_delay(const struct device_node *np)
1980fd0c8280SMark A. Greer {
1981fd0c8280SMark A. Greer int autosuspend_delay, ret;
1982fd0c8280SMark A. Greer
1983fd0c8280SMark A. Greer ret = of_property_read_u32(np, "autosuspend-delay", &autosuspend_delay);
1984fd0c8280SMark A. Greer if (ret)
1985fd0c8280SMark A. Greer autosuspend_delay = TRF7970A_AUTOSUSPEND_DELAY;
1986fd0c8280SMark A. Greer
1987fd0c8280SMark A. Greer return autosuspend_delay;
1988fd0c8280SMark A. Greer }
1989fd0c8280SMark A. Greer
trf7970a_probe(struct spi_device * spi)1990165063f1SMark A. Greer static int trf7970a_probe(struct spi_device *spi)
1991165063f1SMark A. Greer {
1992ea050c5eSKrzysztof Kozlowski const struct device_node *np = spi->dev.of_node;
1993165063f1SMark A. Greer struct trf7970a *trf;
1994fd0c8280SMark A. Greer int uvolts, autosuspend_delay, ret;
1995837eb4d2SGeoff Lansberry u32 clk_freq = TRF7970A_13MHZ_CLOCK_FREQUENCY;
1996165063f1SMark A. Greer
1997165063f1SMark A. Greer if (!np) {
1998165063f1SMark A. Greer dev_err(&spi->dev, "No Device Tree entry\n");
1999165063f1SMark A. Greer return -EINVAL;
2000165063f1SMark A. Greer }
2001165063f1SMark A. Greer
2002165063f1SMark A. Greer trf = devm_kzalloc(&spi->dev, sizeof(*trf), GFP_KERNEL);
2003165063f1SMark A. Greer if (!trf)
2004165063f1SMark A. Greer return -ENOMEM;
2005165063f1SMark A. Greer
2006ceccd6aaSMark A. Greer trf->state = TRF7970A_ST_PWR_OFF;
2007165063f1SMark A. Greer trf->dev = &spi->dev;
2008165063f1SMark A. Greer trf->spi = spi;
2009165063f1SMark A. Greer
2010165063f1SMark A. Greer spi->mode = SPI_MODE_1;
2011165063f1SMark A. Greer spi->bits_per_word = 8;
2012165063f1SMark A. Greer
201324707296SMark A. Greer ret = spi_setup(spi);
201424707296SMark A. Greer if (ret < 0) {
201524707296SMark A. Greer dev_err(trf->dev, "Can't set up SPI Communication\n");
201624707296SMark A. Greer return ret;
201724707296SMark A. Greer }
201824707296SMark A. Greer
2019772079ebSMark A. Greer if (of_property_read_bool(np, "irq-status-read-quirk"))
2020772079ebSMark A. Greer trf->quirks |= TRF7970A_QUIRK_IRQ_STATUS_READ;
2021772079ebSMark A. Greer
202269f984f0SMark Greer /* There are two enable pins - only EN must be present in the DT */
2023d34e48d6SMark Greer trf->en_gpiod = devm_gpiod_get_index(trf->dev, "ti,enable", 0,
2024d34e48d6SMark Greer GPIOD_OUT_LOW);
2025d34e48d6SMark Greer if (IS_ERR(trf->en_gpiod)) {
2026165063f1SMark A. Greer dev_err(trf->dev, "No EN GPIO property\n");
2027d34e48d6SMark Greer return PTR_ERR(trf->en_gpiod);
2028165063f1SMark A. Greer }
2029165063f1SMark A. Greer
2030d34e48d6SMark Greer trf->en2_gpiod = devm_gpiod_get_index_optional(trf->dev, "ti,enable", 1,
2031d34e48d6SMark Greer GPIOD_OUT_LOW);
2032d34e48d6SMark Greer if (!trf->en2_gpiod) {
2033ce69b95cSGuan Ben dev_info(trf->dev, "No EN2 GPIO property\n");
2034d34e48d6SMark Greer } else if (IS_ERR(trf->en2_gpiod)) {
2035d34e48d6SMark Greer dev_err(trf->dev, "Error getting EN2 GPIO property: %ld\n",
2036d34e48d6SMark Greer PTR_ERR(trf->en2_gpiod));
2037d34e48d6SMark Greer return PTR_ERR(trf->en2_gpiod);
2038d34e48d6SMark Greer } else if (of_property_read_bool(np, "en2-rf-quirk")) {
2039afcb9fbdSMark Greer trf->quirks |= TRF7970A_QUIRK_EN2_MUST_STAY_LOW;
2040ce69b95cSGuan Ben }
2041165063f1SMark A. Greer
2042837eb4d2SGeoff Lansberry of_property_read_u32(np, "clock-frequency", &clk_freq);
2043e1038535SColin Ian King if ((clk_freq != TRF7970A_27MHZ_CLOCK_FREQUENCY) &&
2044837eb4d2SGeoff Lansberry (clk_freq != TRF7970A_13MHZ_CLOCK_FREQUENCY)) {
2045837eb4d2SGeoff Lansberry dev_err(trf->dev,
2046e2f0f671SMark Greer "clock-frequency (%u Hz) unsupported\n", clk_freq);
2047837eb4d2SGeoff Lansberry return -EINVAL;
2048837eb4d2SGeoff Lansberry }
2049837eb4d2SGeoff Lansberry
2050bd751808SGeoff Lansberry if (clk_freq == TRF7970A_27MHZ_CLOCK_FREQUENCY) {
2051bd751808SGeoff Lansberry trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_27MHZ;
2052bd751808SGeoff Lansberry dev_dbg(trf->dev, "trf7970a configured for 27MHz crystal\n");
2053bd751808SGeoff Lansberry } else {
2054bd751808SGeoff Lansberry trf->modulator_sys_clk_ctrl = 0;
2055bd751808SGeoff Lansberry }
2056bd751808SGeoff Lansberry
2057165063f1SMark A. Greer ret = devm_request_threaded_irq(trf->dev, spi->irq, NULL,
2058e2f0f671SMark Greer trf7970a_irq,
2059e2f0f671SMark Greer IRQF_TRIGGER_RISING | IRQF_ONESHOT,
2060165063f1SMark A. Greer "trf7970a", trf);
2061165063f1SMark A. Greer if (ret) {
2062165063f1SMark A. Greer dev_err(trf->dev, "Can't request IRQ#%d: %d\n", spi->irq, ret);
2063165063f1SMark A. Greer return ret;
2064165063f1SMark A. Greer }
2065165063f1SMark A. Greer
2066165063f1SMark A. Greer mutex_init(&trf->lock);
2067165063f1SMark A. Greer INIT_DELAYED_WORK(&trf->timeout_work, trf7970a_timeout_work_handler);
2068165063f1SMark A. Greer
2069*cffee39dSPaul Geurts trf->vin_regulator = devm_regulator_get(&spi->dev, "vin");
2070*cffee39dSPaul Geurts if (IS_ERR(trf->vin_regulator)) {
2071*cffee39dSPaul Geurts ret = PTR_ERR(trf->vin_regulator);
2072165063f1SMark A. Greer dev_err(trf->dev, "Can't get VIN regulator: %d\n", ret);
2073165063f1SMark A. Greer goto err_destroy_lock;
2074165063f1SMark A. Greer }
2075165063f1SMark A. Greer
2076*cffee39dSPaul Geurts ret = regulator_enable(trf->vin_regulator);
2077165063f1SMark A. Greer if (ret) {
2078165063f1SMark A. Greer dev_err(trf->dev, "Can't enable VIN: %d\n", ret);
2079165063f1SMark A. Greer goto err_destroy_lock;
2080165063f1SMark A. Greer }
2081165063f1SMark A. Greer
2082*cffee39dSPaul Geurts uvolts = regulator_get_voltage(trf->vin_regulator);
2083ebcc5a0dSMark A. Greer if (uvolts > 4000000)
2084ebcc5a0dSMark A. Greer trf->chip_status_ctrl = TRF7970A_CHIP_STATUS_VRS5_3;
2085ebcc5a0dSMark A. Greer
2086*cffee39dSPaul Geurts trf->vddio_regulator = devm_regulator_get(&spi->dev, "vdd-io");
2087*cffee39dSPaul Geurts if (IS_ERR(trf->vddio_regulator)) {
2088*cffee39dSPaul Geurts ret = PTR_ERR(trf->vddio_regulator);
208949d22c70SGeoff Lansberry dev_err(trf->dev, "Can't get VDD_IO regulator: %d\n", ret);
2090*cffee39dSPaul Geurts goto err_disable_vin_regulator;
209149d22c70SGeoff Lansberry }
209249d22c70SGeoff Lansberry
2093*cffee39dSPaul Geurts ret = regulator_enable(trf->vddio_regulator);
209449d22c70SGeoff Lansberry if (ret) {
209549d22c70SGeoff Lansberry dev_err(trf->dev, "Can't enable VDD_IO: %d\n", ret);
2096*cffee39dSPaul Geurts goto err_disable_vin_regulator;
209749d22c70SGeoff Lansberry }
209849d22c70SGeoff Lansberry
2099*cffee39dSPaul Geurts if (regulator_get_voltage(trf->vddio_regulator) == 1800000) {
210049d22c70SGeoff Lansberry trf->io_ctrl = TRF7970A_REG_IO_CTRL_IO_LOW;
210149d22c70SGeoff Lansberry dev_dbg(trf->dev, "trf7970a config vdd_io to 1.8V\n");
210249d22c70SGeoff Lansberry }
210349d22c70SGeoff Lansberry
2104165063f1SMark A. Greer trf->ddev = nfc_digital_allocate_device(&trf7970a_nfc_ops,
2105165063f1SMark A. Greer TRF7970A_SUPPORTED_PROTOCOLS,
210613b4272aSMark A. Greer NFC_DIGITAL_DRV_CAPS_IN_CRC |
2107e2f0f671SMark Greer NFC_DIGITAL_DRV_CAPS_TG_CRC, 0,
2108e2f0f671SMark Greer 0);
2109165063f1SMark A. Greer if (!trf->ddev) {
2110165063f1SMark A. Greer dev_err(trf->dev, "Can't allocate NFC digital device\n");
2111165063f1SMark A. Greer ret = -ENOMEM;
2112*cffee39dSPaul Geurts goto err_disable_vddio_regulator;
2113165063f1SMark A. Greer }
2114165063f1SMark A. Greer
2115165063f1SMark A. Greer nfc_digital_set_parent_dev(trf->ddev, trf->dev);
2116165063f1SMark A. Greer nfc_digital_set_drvdata(trf->ddev, trf);
2117165063f1SMark A. Greer spi_set_drvdata(spi, trf);
2118165063f1SMark A. Greer
2119fd0c8280SMark A. Greer autosuspend_delay = trf7970a_get_autosuspend_delay(np);
2120fd0c8280SMark A. Greer
2121fd0c8280SMark A. Greer pm_runtime_set_autosuspend_delay(trf->dev, autosuspend_delay);
2122e6403b7cSMark A. Greer pm_runtime_use_autosuspend(trf->dev);
2123ceccd6aaSMark A. Greer
2124b528281bSMark A. Greer ret = trf7970a_startup(trf);
2125ceccd6aaSMark A. Greer if (ret)
2126ceccd6aaSMark A. Greer goto err_free_ddev;
2127ceccd6aaSMark A. Greer
2128165063f1SMark A. Greer ret = nfc_digital_register_device(trf->ddev);
2129165063f1SMark A. Greer if (ret) {
2130165063f1SMark A. Greer dev_err(trf->dev, "Can't register NFC digital device: %d\n",
2131165063f1SMark A. Greer ret);
2132b528281bSMark A. Greer goto err_shutdown;
2133165063f1SMark A. Greer }
2134165063f1SMark A. Greer
2135165063f1SMark A. Greer return 0;
2136165063f1SMark A. Greer
2137b528281bSMark A. Greer err_shutdown:
2138b528281bSMark A. Greer trf7970a_shutdown(trf);
2139ceccd6aaSMark A. Greer err_free_ddev:
2140165063f1SMark A. Greer nfc_digital_free_device(trf->ddev);
2141*cffee39dSPaul Geurts err_disable_vddio_regulator:
2142*cffee39dSPaul Geurts regulator_disable(trf->vddio_regulator);
2143*cffee39dSPaul Geurts err_disable_vin_regulator:
2144*cffee39dSPaul Geurts regulator_disable(trf->vin_regulator);
2145165063f1SMark A. Greer err_destroy_lock:
2146165063f1SMark A. Greer mutex_destroy(&trf->lock);
2147165063f1SMark A. Greer return ret;
2148165063f1SMark A. Greer }
2149165063f1SMark A. Greer
trf7970a_remove(struct spi_device * spi)2150a0386bbaSUwe Kleine-König static void trf7970a_remove(struct spi_device *spi)
2151165063f1SMark A. Greer {
2152165063f1SMark A. Greer struct trf7970a *trf = spi_get_drvdata(spi);
2153165063f1SMark A. Greer
2154165063f1SMark A. Greer mutex_lock(&trf->lock);
2155165063f1SMark A. Greer
2156b528281bSMark A. Greer trf7970a_shutdown(trf);
2157ceccd6aaSMark A. Greer
2158ceccd6aaSMark A. Greer mutex_unlock(&trf->lock);
2159e6403b7cSMark A. Greer
2160165063f1SMark A. Greer nfc_digital_unregister_device(trf->ddev);
2161165063f1SMark A. Greer nfc_digital_free_device(trf->ddev);
2162165063f1SMark A. Greer
2163*cffee39dSPaul Geurts regulator_disable(trf->vddio_regulator);
2164*cffee39dSPaul Geurts regulator_disable(trf->vin_regulator);
2165165063f1SMark A. Greer
2166165063f1SMark A. Greer mutex_destroy(&trf->lock);
2167165063f1SMark A. Greer }
2168165063f1SMark A. Greer
216977c9539dSMark A. Greer #ifdef CONFIG_PM_SLEEP
trf7970a_suspend(struct device * dev)217077c9539dSMark A. Greer static int trf7970a_suspend(struct device *dev)
217177c9539dSMark A. Greer {
217288e2ce01SGeliang Tang struct spi_device *spi = to_spi_device(dev);
217377c9539dSMark A. Greer struct trf7970a *trf = spi_get_drvdata(spi);
217477c9539dSMark A. Greer
217577c9539dSMark A. Greer mutex_lock(&trf->lock);
217677c9539dSMark A. Greer
217777c9539dSMark A. Greer trf7970a_shutdown(trf);
217877c9539dSMark A. Greer
217977c9539dSMark A. Greer mutex_unlock(&trf->lock);
218077c9539dSMark A. Greer
2181671970f5SMark A. Greer return 0;
218277c9539dSMark A. Greer }
218377c9539dSMark A. Greer
trf7970a_resume(struct device * dev)218477c9539dSMark A. Greer static int trf7970a_resume(struct device *dev)
218577c9539dSMark A. Greer {
218688e2ce01SGeliang Tang struct spi_device *spi = to_spi_device(dev);
218777c9539dSMark A. Greer struct trf7970a *trf = spi_get_drvdata(spi);
218855ef2e75SMark A. Greer int ret;
218977c9539dSMark A. Greer
219077c9539dSMark A. Greer mutex_lock(&trf->lock);
219177c9539dSMark A. Greer
219277c9539dSMark A. Greer ret = trf7970a_startup(trf);
219377c9539dSMark A. Greer
219477c9539dSMark A. Greer mutex_unlock(&trf->lock);
219577c9539dSMark A. Greer
219677c9539dSMark A. Greer return ret;
219777c9539dSMark A. Greer }
219877c9539dSMark A. Greer #endif
219977c9539dSMark A. Greer
2200e8a9235cSRafael J. Wysocki #ifdef CONFIG_PM
trf7970a_pm_runtime_suspend(struct device * dev)2201e6403b7cSMark A. Greer static int trf7970a_pm_runtime_suspend(struct device *dev)
2202e6403b7cSMark A. Greer {
220388e2ce01SGeliang Tang struct spi_device *spi = to_spi_device(dev);
2204e6403b7cSMark A. Greer struct trf7970a *trf = spi_get_drvdata(spi);
2205e6403b7cSMark A. Greer int ret;
2206e6403b7cSMark A. Greer
2207ceccd6aaSMark A. Greer mutex_lock(&trf->lock);
2208e6403b7cSMark A. Greer
2209ceccd6aaSMark A. Greer ret = trf7970a_power_down(trf);
2210e6403b7cSMark A. Greer
2211ceccd6aaSMark A. Greer mutex_unlock(&trf->lock);
2212e6403b7cSMark A. Greer
2213e6403b7cSMark A. Greer return ret;
2214e6403b7cSMark A. Greer }
2215e6403b7cSMark A. Greer
trf7970a_pm_runtime_resume(struct device * dev)2216e6403b7cSMark A. Greer static int trf7970a_pm_runtime_resume(struct device *dev)
2217e6403b7cSMark A. Greer {
221888e2ce01SGeliang Tang struct spi_device *spi = to_spi_device(dev);
2219e6403b7cSMark A. Greer struct trf7970a *trf = spi_get_drvdata(spi);
2220e6403b7cSMark A. Greer int ret;
2221e6403b7cSMark A. Greer
2222ceccd6aaSMark A. Greer ret = trf7970a_power_up(trf);
2223ceccd6aaSMark A. Greer if (!ret)
2224e6403b7cSMark A. Greer pm_runtime_mark_last_busy(dev);
2225e6403b7cSMark A. Greer
2226ceccd6aaSMark A. Greer return ret;
2227e6403b7cSMark A. Greer }
2228e6403b7cSMark A. Greer #endif
2229e6403b7cSMark A. Greer
2230e6403b7cSMark A. Greer static const struct dev_pm_ops trf7970a_pm_ops = {
223177c9539dSMark A. Greer SET_SYSTEM_SLEEP_PM_OPS(trf7970a_suspend, trf7970a_resume)
2232e6403b7cSMark A. Greer SET_RUNTIME_PM_OPS(trf7970a_pm_runtime_suspend,
2233e6403b7cSMark A. Greer trf7970a_pm_runtime_resume, NULL)
2234e6403b7cSMark A. Greer };
2235e6403b7cSMark A. Greer
2236a52ed50aSKrzysztof Kozlowski static const struct of_device_id trf7970a_of_match[] __maybe_unused = {
22373c39c1a5SJavier Martinez Canillas {.compatible = "ti,trf7970a",},
2238fcc652f6SMark Greer {},
22393c39c1a5SJavier Martinez Canillas };
2240e2f0f671SMark Greer
22413c39c1a5SJavier Martinez Canillas MODULE_DEVICE_TABLE(of, trf7970a_of_match);
22423c39c1a5SJavier Martinez Canillas
2243165063f1SMark A. Greer static const struct spi_device_id trf7970a_id_table[] = {
2244772079ebSMark A. Greer {"trf7970a", 0},
2245165063f1SMark A. Greer {}
2246165063f1SMark A. Greer };
2247e2f0f671SMark Greer
2248165063f1SMark A. Greer MODULE_DEVICE_TABLE(spi, trf7970a_id_table);
2249165063f1SMark A. Greer
2250165063f1SMark A. Greer static struct spi_driver trf7970a_spi_driver = {
2251165063f1SMark A. Greer .probe = trf7970a_probe,
2252165063f1SMark A. Greer .remove = trf7970a_remove,
2253165063f1SMark A. Greer .id_table = trf7970a_id_table,
2254165063f1SMark A. Greer .driver = {
2255165063f1SMark A. Greer .name = "trf7970a",
22563c39c1a5SJavier Martinez Canillas .of_match_table = of_match_ptr(trf7970a_of_match),
2257e6403b7cSMark A. Greer .pm = &trf7970a_pm_ops,
2258165063f1SMark A. Greer },
2259165063f1SMark A. Greer };
2260165063f1SMark A. Greer
2261165063f1SMark A. Greer module_spi_driver(trf7970a_spi_driver);
2262165063f1SMark A. Greer
2263165063f1SMark A. Greer MODULE_AUTHOR("Mark A. Greer <mgreer@animalcreek.com>");
2264165063f1SMark A. Greer MODULE_LICENSE("GPL v2");
2265165063f1SMark A. Greer MODULE_DESCRIPTION("TI trf7970a RFID/NFC Transceiver Driver");
2266