xref: /OK3568_Linux_fs/kernel/drivers/nfc/pn544/i2c.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * I2C Link Layer for PN544 HCI based Driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2012  Intel Corporation. All rights reserved.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/crc-ccitt.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/i2c.h>
13*4882a593Smuzhiyun #include <linux/acpi.h>
14*4882a593Smuzhiyun #include <linux/interrupt.h>
15*4882a593Smuzhiyun #include <linux/delay.h>
16*4882a593Smuzhiyun #include <linux/nfc.h>
17*4882a593Smuzhiyun #include <linux/firmware.h>
18*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <asm/unaligned.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include <net/nfc/hci.h>
23*4882a593Smuzhiyun #include <net/nfc/llc.h>
24*4882a593Smuzhiyun #include <net/nfc/nfc.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #include "pn544.h"
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define PN544_I2C_FRAME_HEADROOM 1
29*4882a593Smuzhiyun #define PN544_I2C_FRAME_TAILROOM 2
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun /* GPIO names */
32*4882a593Smuzhiyun #define PN544_GPIO_NAME_IRQ "pn544_irq"
33*4882a593Smuzhiyun #define PN544_GPIO_NAME_FW  "pn544_fw"
34*4882a593Smuzhiyun #define PN544_GPIO_NAME_EN  "pn544_en"
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* framing in HCI mode */
37*4882a593Smuzhiyun #define PN544_HCI_I2C_LLC_LEN		1
38*4882a593Smuzhiyun #define PN544_HCI_I2C_LLC_CRC		2
39*4882a593Smuzhiyun #define PN544_HCI_I2C_LLC_LEN_CRC	(PN544_HCI_I2C_LLC_LEN + \
40*4882a593Smuzhiyun 					 PN544_HCI_I2C_LLC_CRC)
41*4882a593Smuzhiyun #define PN544_HCI_I2C_LLC_MIN_SIZE	(1 + PN544_HCI_I2C_LLC_LEN_CRC)
42*4882a593Smuzhiyun #define PN544_HCI_I2C_LLC_MAX_PAYLOAD	29
43*4882a593Smuzhiyun #define PN544_HCI_I2C_LLC_MAX_SIZE	(PN544_HCI_I2C_LLC_LEN_CRC + 1 + \
44*4882a593Smuzhiyun 					 PN544_HCI_I2C_LLC_MAX_PAYLOAD)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun static const struct i2c_device_id pn544_hci_i2c_id_table[] = {
47*4882a593Smuzhiyun 	{"pn544", 0},
48*4882a593Smuzhiyun 	{}
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, pn544_hci_i2c_id_table);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun static const struct acpi_device_id pn544_hci_i2c_acpi_match[] = {
54*4882a593Smuzhiyun 	{"NXP5440", 0},
55*4882a593Smuzhiyun 	{}
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun MODULE_DEVICE_TABLE(acpi, pn544_hci_i2c_acpi_match);
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define PN544_HCI_I2C_DRIVER_NAME "pn544_hci_i2c"
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun  * Exposed through the 4 most significant bytes
64*4882a593Smuzhiyun  * from the HCI SW_VERSION first byte, a.k.a.
65*4882a593Smuzhiyun  * SW RomLib.
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun #define PN544_HW_VARIANT_C2 0xa
68*4882a593Smuzhiyun #define PN544_HW_VARIANT_C3 0xb
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define PN544_FW_CMD_RESET 0x01
71*4882a593Smuzhiyun #define PN544_FW_CMD_WRITE 0x08
72*4882a593Smuzhiyun #define PN544_FW_CMD_CHECK 0x06
73*4882a593Smuzhiyun #define PN544_FW_CMD_SECURE_WRITE 0x0C
74*4882a593Smuzhiyun #define PN544_FW_CMD_SECURE_CHUNK_WRITE 0x0D
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun struct pn544_i2c_fw_frame_write {
77*4882a593Smuzhiyun 	u8 cmd;
78*4882a593Smuzhiyun 	u16 be_length;
79*4882a593Smuzhiyun 	u8 be_dest_addr[3];
80*4882a593Smuzhiyun 	u16 be_datalen;
81*4882a593Smuzhiyun 	u8 data[];
82*4882a593Smuzhiyun } __packed;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun struct pn544_i2c_fw_frame_check {
85*4882a593Smuzhiyun 	u8 cmd;
86*4882a593Smuzhiyun 	u16 be_length;
87*4882a593Smuzhiyun 	u8 be_start_addr[3];
88*4882a593Smuzhiyun 	u16 be_datalen;
89*4882a593Smuzhiyun 	u16 be_crc;
90*4882a593Smuzhiyun } __packed;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct pn544_i2c_fw_frame_response {
93*4882a593Smuzhiyun 	u8 status;
94*4882a593Smuzhiyun 	u16 be_length;
95*4882a593Smuzhiyun } __packed;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun struct pn544_i2c_fw_blob {
98*4882a593Smuzhiyun 	u32 be_size;
99*4882a593Smuzhiyun 	u32 be_destaddr;
100*4882a593Smuzhiyun 	u8 data[];
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun struct pn544_i2c_fw_secure_frame {
104*4882a593Smuzhiyun 	u8 cmd;
105*4882a593Smuzhiyun 	u16 be_datalen;
106*4882a593Smuzhiyun 	u8 data[];
107*4882a593Smuzhiyun } __packed;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun struct pn544_i2c_fw_secure_blob {
110*4882a593Smuzhiyun 	u64 header;
111*4882a593Smuzhiyun 	u8 data[];
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_TIMEOUT 0x01
115*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_BAD_CRC 0x02
116*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_ACCESS_DENIED 0x08
117*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_PROTOCOL_ERROR 0x0B
118*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_INVALID_PARAMETER 0x11
119*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_UNSUPPORTED_COMMAND 0x13
120*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_INVALID_LENGTH 0x18
121*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_CRYPTOGRAPHIC_ERROR 0x19
122*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_VERSION_CONDITIONS_ERROR 0x1D
123*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_MEMORY_ERROR 0x20
124*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_CHUNK_OK 0x21
125*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_WRITE_FAILED 0x74
126*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_COMMAND_REJECTED 0xE0
127*4882a593Smuzhiyun #define PN544_FW_CMD_RESULT_CHUNK_ERROR 0xE6
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #define PN544_FW_WRITE_BUFFER_MAX_LEN 0x9f7
132*4882a593Smuzhiyun #define PN544_FW_I2C_MAX_PAYLOAD PN544_HCI_I2C_LLC_MAX_SIZE
133*4882a593Smuzhiyun #define PN544_FW_I2C_WRITE_FRAME_HEADER_LEN 8
134*4882a593Smuzhiyun #define PN544_FW_I2C_WRITE_DATA_MAX_LEN MIN((PN544_FW_I2C_MAX_PAYLOAD -\
135*4882a593Smuzhiyun 					 PN544_FW_I2C_WRITE_FRAME_HEADER_LEN),\
136*4882a593Smuzhiyun 					 PN544_FW_WRITE_BUFFER_MAX_LEN)
137*4882a593Smuzhiyun #define PN544_FW_SECURE_CHUNK_WRITE_HEADER_LEN 3
138*4882a593Smuzhiyun #define PN544_FW_SECURE_CHUNK_WRITE_DATA_MAX_LEN (PN544_FW_I2C_MAX_PAYLOAD -\
139*4882a593Smuzhiyun 			PN544_FW_SECURE_CHUNK_WRITE_HEADER_LEN)
140*4882a593Smuzhiyun #define PN544_FW_SECURE_FRAME_HEADER_LEN 3
141*4882a593Smuzhiyun #define PN544_FW_SECURE_BLOB_HEADER_LEN 8
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define FW_WORK_STATE_IDLE 1
144*4882a593Smuzhiyun #define FW_WORK_STATE_START 2
145*4882a593Smuzhiyun #define FW_WORK_STATE_WAIT_WRITE_ANSWER 3
146*4882a593Smuzhiyun #define FW_WORK_STATE_WAIT_CHECK_ANSWER 4
147*4882a593Smuzhiyun #define FW_WORK_STATE_WAIT_SECURE_WRITE_ANSWER 5
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun struct pn544_i2c_phy {
150*4882a593Smuzhiyun 	struct i2c_client *i2c_dev;
151*4882a593Smuzhiyun 	struct nfc_hci_dev *hdev;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	struct gpio_desc *gpiod_en;
154*4882a593Smuzhiyun 	struct gpio_desc *gpiod_fw;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	unsigned int en_polarity;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	u8 hw_variant;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	struct work_struct fw_work;
161*4882a593Smuzhiyun 	int fw_work_state;
162*4882a593Smuzhiyun 	char firmware_name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
163*4882a593Smuzhiyun 	const struct firmware *fw;
164*4882a593Smuzhiyun 	u32 fw_blob_dest_addr;
165*4882a593Smuzhiyun 	size_t fw_blob_size;
166*4882a593Smuzhiyun 	const u8 *fw_blob_data;
167*4882a593Smuzhiyun 	size_t fw_written;
168*4882a593Smuzhiyun 	size_t fw_size;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	int fw_cmd_result;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	int powered;
173*4882a593Smuzhiyun 	int run_mode;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	int hard_fault;		/*
176*4882a593Smuzhiyun 				 * < 0 if hardware error occured (e.g. i2c err)
177*4882a593Smuzhiyun 				 * and prevents normal operation.
178*4882a593Smuzhiyun 				 */
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun #define I2C_DUMP_SKB(info, skb)					\
182*4882a593Smuzhiyun do {								\
183*4882a593Smuzhiyun 	pr_debug("%s:\n", info);				\
184*4882a593Smuzhiyun 	print_hex_dump(KERN_DEBUG, "i2c: ", DUMP_PREFIX_OFFSET,	\
185*4882a593Smuzhiyun 		       16, 1, (skb)->data, (skb)->len, 0);	\
186*4882a593Smuzhiyun } while (0)
187*4882a593Smuzhiyun 
pn544_hci_i2c_platform_init(struct pn544_i2c_phy * phy)188*4882a593Smuzhiyun static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun 	int polarity, retry, ret;
191*4882a593Smuzhiyun 	char rset_cmd[] = { 0x05, 0xF9, 0x04, 0x00, 0xC3, 0xE5 };
192*4882a593Smuzhiyun 	int count = sizeof(rset_cmd);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n");
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	/* Disable fw download */
197*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_fw, 0);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	for (polarity = 0; polarity < 2; polarity++) {
200*4882a593Smuzhiyun 		phy->en_polarity = polarity;
201*4882a593Smuzhiyun 		retry = 3;
202*4882a593Smuzhiyun 		while (retry--) {
203*4882a593Smuzhiyun 			/* power off */
204*4882a593Smuzhiyun 			gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity);
205*4882a593Smuzhiyun 			usleep_range(10000, 15000);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 			/* power on */
208*4882a593Smuzhiyun 			gpiod_set_value_cansleep(phy->gpiod_en, phy->en_polarity);
209*4882a593Smuzhiyun 			usleep_range(10000, 15000);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 			/* send reset */
212*4882a593Smuzhiyun 			dev_dbg(&phy->i2c_dev->dev, "Sending reset cmd\n");
213*4882a593Smuzhiyun 			ret = i2c_master_send(phy->i2c_dev, rset_cmd, count);
214*4882a593Smuzhiyun 			if (ret == count) {
215*4882a593Smuzhiyun 				nfc_info(&phy->i2c_dev->dev,
216*4882a593Smuzhiyun 					 "nfc_en polarity : active %s\n",
217*4882a593Smuzhiyun 					 (polarity == 0 ? "low" : "high"));
218*4882a593Smuzhiyun 				goto out;
219*4882a593Smuzhiyun 			}
220*4882a593Smuzhiyun 		}
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	nfc_err(&phy->i2c_dev->dev,
224*4882a593Smuzhiyun 		"Could not detect nfc_en polarity, fallback to active high\n");
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun out:
227*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity);
228*4882a593Smuzhiyun 	usleep_range(10000, 15000);
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
pn544_hci_i2c_enable_mode(struct pn544_i2c_phy * phy,int run_mode)231*4882a593Smuzhiyun static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_fw, run_mode == PN544_FW_MODE ? 1 : 0);
234*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_en, phy->en_polarity);
235*4882a593Smuzhiyun 	usleep_range(10000, 15000);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	phy->run_mode = run_mode;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun 
pn544_hci_i2c_enable(void * phy_id)240*4882a593Smuzhiyun static int pn544_hci_i2c_enable(void *phy_id)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = phy_id;
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	pr_info("%s\n", __func__);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	pn544_hci_i2c_enable_mode(phy, PN544_HCI_MODE);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	phy->powered = 1;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	return 0;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun 
pn544_hci_i2c_disable(void * phy_id)253*4882a593Smuzhiyun static void pn544_hci_i2c_disable(void *phy_id)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = phy_id;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_fw, 0);
258*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity);
259*4882a593Smuzhiyun 	usleep_range(10000, 15000);
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_en, phy->en_polarity);
262*4882a593Smuzhiyun 	usleep_range(10000, 15000);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity);
265*4882a593Smuzhiyun 	usleep_range(10000, 15000);
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	phy->powered = 0;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
pn544_hci_i2c_add_len_crc(struct sk_buff * skb)270*4882a593Smuzhiyun static void pn544_hci_i2c_add_len_crc(struct sk_buff *skb)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun 	u16 crc;
273*4882a593Smuzhiyun 	int len;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	len = skb->len + 2;
276*4882a593Smuzhiyun 	*(u8 *)skb_push(skb, 1) = len;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	crc = crc_ccitt(0xffff, skb->data, skb->len);
279*4882a593Smuzhiyun 	crc = ~crc;
280*4882a593Smuzhiyun 	skb_put_u8(skb, crc & 0xff);
281*4882a593Smuzhiyun 	skb_put_u8(skb, crc >> 8);
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun 
pn544_hci_i2c_remove_len_crc(struct sk_buff * skb)284*4882a593Smuzhiyun static void pn544_hci_i2c_remove_len_crc(struct sk_buff *skb)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun 	skb_pull(skb, PN544_I2C_FRAME_HEADROOM);
287*4882a593Smuzhiyun 	skb_trim(skb, PN544_I2C_FRAME_TAILROOM);
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /*
291*4882a593Smuzhiyun  * Writing a frame must not return the number of written bytes.
292*4882a593Smuzhiyun  * It must return either zero for success, or <0 for error.
293*4882a593Smuzhiyun  * In addition, it must not alter the skb
294*4882a593Smuzhiyun  */
pn544_hci_i2c_write(void * phy_id,struct sk_buff * skb)295*4882a593Smuzhiyun static int pn544_hci_i2c_write(void *phy_id, struct sk_buff *skb)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun 	int r;
298*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = phy_id;
299*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	if (phy->hard_fault != 0)
302*4882a593Smuzhiyun 		return phy->hard_fault;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	usleep_range(3000, 6000);
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	pn544_hci_i2c_add_len_crc(skb);
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	I2C_DUMP_SKB("i2c frame written", skb);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 	r = i2c_master_send(client, skb->data, skb->len);
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	if (r == -EREMOTEIO) {	/* Retry, chip was in standby */
313*4882a593Smuzhiyun 		usleep_range(6000, 10000);
314*4882a593Smuzhiyun 		r = i2c_master_send(client, skb->data, skb->len);
315*4882a593Smuzhiyun 	}
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	if (r >= 0) {
318*4882a593Smuzhiyun 		if (r != skb->len)
319*4882a593Smuzhiyun 			r = -EREMOTEIO;
320*4882a593Smuzhiyun 		else
321*4882a593Smuzhiyun 			r = 0;
322*4882a593Smuzhiyun 	}
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	pn544_hci_i2c_remove_len_crc(skb);
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	return r;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun 
check_crc(u8 * buf,int buflen)329*4882a593Smuzhiyun static int check_crc(u8 *buf, int buflen)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	int len;
332*4882a593Smuzhiyun 	u16 crc;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	len = buf[0] + 1;
335*4882a593Smuzhiyun 	crc = crc_ccitt(0xffff, buf, len - 2);
336*4882a593Smuzhiyun 	crc = ~crc;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	if (buf[len - 2] != (crc & 0xff) || buf[len - 1] != (crc >> 8)) {
339*4882a593Smuzhiyun 		pr_err("CRC error 0x%x != 0x%x 0x%x\n",
340*4882a593Smuzhiyun 		       crc, buf[len - 1], buf[len - 2]);
341*4882a593Smuzhiyun 		pr_info("%s: BAD CRC\n", __func__);
342*4882a593Smuzhiyun 		print_hex_dump(KERN_DEBUG, "crc: ", DUMP_PREFIX_NONE,
343*4882a593Smuzhiyun 			       16, 2, buf, buflen, false);
344*4882a593Smuzhiyun 		return -EPERM;
345*4882a593Smuzhiyun 	}
346*4882a593Smuzhiyun 	return 0;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun /*
350*4882a593Smuzhiyun  * Reads an shdlc frame and returns it in a newly allocated sk_buff. Guarantees
351*4882a593Smuzhiyun  * that i2c bus will be flushed and that next read will start on a new frame.
352*4882a593Smuzhiyun  * returned skb contains only LLC header and payload.
353*4882a593Smuzhiyun  * returns:
354*4882a593Smuzhiyun  * -EREMOTEIO : i2c read error (fatal)
355*4882a593Smuzhiyun  * -EBADMSG : frame was incorrect and discarded
356*4882a593Smuzhiyun  * -ENOMEM : cannot allocate skb, frame dropped
357*4882a593Smuzhiyun  */
pn544_hci_i2c_read(struct pn544_i2c_phy * phy,struct sk_buff ** skb)358*4882a593Smuzhiyun static int pn544_hci_i2c_read(struct pn544_i2c_phy *phy, struct sk_buff **skb)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun 	int r;
361*4882a593Smuzhiyun 	u8 len;
362*4882a593Smuzhiyun 	u8 tmp[PN544_HCI_I2C_LLC_MAX_SIZE - 1];
363*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	r = i2c_master_recv(client, &len, 1);
366*4882a593Smuzhiyun 	if (r != 1) {
367*4882a593Smuzhiyun 		nfc_err(&client->dev, "cannot read len byte\n");
368*4882a593Smuzhiyun 		return -EREMOTEIO;
369*4882a593Smuzhiyun 	}
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	if ((len < (PN544_HCI_I2C_LLC_MIN_SIZE - 1)) ||
372*4882a593Smuzhiyun 	    (len > (PN544_HCI_I2C_LLC_MAX_SIZE - 1))) {
373*4882a593Smuzhiyun 		nfc_err(&client->dev, "invalid len byte\n");
374*4882a593Smuzhiyun 		r = -EBADMSG;
375*4882a593Smuzhiyun 		goto flush;
376*4882a593Smuzhiyun 	}
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	*skb = alloc_skb(1 + len, GFP_KERNEL);
379*4882a593Smuzhiyun 	if (*skb == NULL) {
380*4882a593Smuzhiyun 		r = -ENOMEM;
381*4882a593Smuzhiyun 		goto flush;
382*4882a593Smuzhiyun 	}
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	skb_put_u8(*skb, len);
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	r = i2c_master_recv(client, skb_put(*skb, len), len);
387*4882a593Smuzhiyun 	if (r != len) {
388*4882a593Smuzhiyun 		kfree_skb(*skb);
389*4882a593Smuzhiyun 		return -EREMOTEIO;
390*4882a593Smuzhiyun 	}
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	I2C_DUMP_SKB("i2c frame read", *skb);
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 	r = check_crc((*skb)->data, (*skb)->len);
395*4882a593Smuzhiyun 	if (r != 0) {
396*4882a593Smuzhiyun 		kfree_skb(*skb);
397*4882a593Smuzhiyun 		r = -EBADMSG;
398*4882a593Smuzhiyun 		goto flush;
399*4882a593Smuzhiyun 	}
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	skb_pull(*skb, 1);
402*4882a593Smuzhiyun 	skb_trim(*skb, (*skb)->len - 2);
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	usleep_range(3000, 6000);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	return 0;
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun flush:
409*4882a593Smuzhiyun 	if (i2c_master_recv(client, tmp, sizeof(tmp)) < 0)
410*4882a593Smuzhiyun 		r = -EREMOTEIO;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	usleep_range(3000, 6000);
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	return r;
415*4882a593Smuzhiyun }
416*4882a593Smuzhiyun 
pn544_hci_i2c_fw_read_status(struct pn544_i2c_phy * phy)417*4882a593Smuzhiyun static int pn544_hci_i2c_fw_read_status(struct pn544_i2c_phy *phy)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun 	int r;
420*4882a593Smuzhiyun 	struct pn544_i2c_fw_frame_response response;
421*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	r = i2c_master_recv(client, (char *) &response, sizeof(response));
424*4882a593Smuzhiyun 	if (r != sizeof(response)) {
425*4882a593Smuzhiyun 		nfc_err(&client->dev, "cannot read fw status\n");
426*4882a593Smuzhiyun 		return -EIO;
427*4882a593Smuzhiyun 	}
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	usleep_range(3000, 6000);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	switch (response.status) {
432*4882a593Smuzhiyun 	case 0:
433*4882a593Smuzhiyun 		return 0;
434*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_CHUNK_OK:
435*4882a593Smuzhiyun 		return response.status;
436*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_TIMEOUT:
437*4882a593Smuzhiyun 		return -ETIMEDOUT;
438*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_BAD_CRC:
439*4882a593Smuzhiyun 		return -ENODATA;
440*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_ACCESS_DENIED:
441*4882a593Smuzhiyun 		return -EACCES;
442*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_PROTOCOL_ERROR:
443*4882a593Smuzhiyun 		return -EPROTO;
444*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_INVALID_PARAMETER:
445*4882a593Smuzhiyun 		return -EINVAL;
446*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_UNSUPPORTED_COMMAND:
447*4882a593Smuzhiyun 		return -ENOTSUPP;
448*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_INVALID_LENGTH:
449*4882a593Smuzhiyun 		return -EBADMSG;
450*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_CRYPTOGRAPHIC_ERROR:
451*4882a593Smuzhiyun 		return -ENOKEY;
452*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_VERSION_CONDITIONS_ERROR:
453*4882a593Smuzhiyun 		return -EINVAL;
454*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_MEMORY_ERROR:
455*4882a593Smuzhiyun 		return -ENOMEM;
456*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_COMMAND_REJECTED:
457*4882a593Smuzhiyun 		return -EACCES;
458*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_WRITE_FAILED:
459*4882a593Smuzhiyun 	case PN544_FW_CMD_RESULT_CHUNK_ERROR:
460*4882a593Smuzhiyun 		return -EIO;
461*4882a593Smuzhiyun 	default:
462*4882a593Smuzhiyun 		return -EIO;
463*4882a593Smuzhiyun 	}
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun /*
467*4882a593Smuzhiyun  * Reads an shdlc frame from the chip. This is not as straightforward as it
468*4882a593Smuzhiyun  * seems. There are cases where we could loose the frame start synchronization.
469*4882a593Smuzhiyun  * The frame format is len-data-crc, and corruption can occur anywhere while
470*4882a593Smuzhiyun  * transiting on i2c bus, such that we could read an invalid len.
471*4882a593Smuzhiyun  * In order to recover synchronization with the next frame, we must be sure
472*4882a593Smuzhiyun  * to read the real amount of data without using the len byte. We do this by
473*4882a593Smuzhiyun  * assuming the following:
474*4882a593Smuzhiyun  * - the chip will always present only one single complete frame on the bus
475*4882a593Smuzhiyun  *   before triggering the interrupt
476*4882a593Smuzhiyun  * - the chip will not present a new frame until we have completely read
477*4882a593Smuzhiyun  *   the previous one (or until we have handled the interrupt).
478*4882a593Smuzhiyun  * The tricky case is when we read a corrupted len that is less than the real
479*4882a593Smuzhiyun  * len. We must detect this here in order to determine that we need to flush
480*4882a593Smuzhiyun  * the bus. This is the reason why we check the crc here.
481*4882a593Smuzhiyun  */
pn544_hci_i2c_irq_thread_fn(int irq,void * phy_id)482*4882a593Smuzhiyun static irqreturn_t pn544_hci_i2c_irq_thread_fn(int irq, void *phy_id)
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = phy_id;
485*4882a593Smuzhiyun 	struct i2c_client *client;
486*4882a593Smuzhiyun 	struct sk_buff *skb = NULL;
487*4882a593Smuzhiyun 	int r;
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	if (!phy || irq != phy->i2c_dev->irq) {
490*4882a593Smuzhiyun 		WARN_ON_ONCE(1);
491*4882a593Smuzhiyun 		return IRQ_NONE;
492*4882a593Smuzhiyun 	}
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	client = phy->i2c_dev;
495*4882a593Smuzhiyun 	dev_dbg(&client->dev, "IRQ\n");
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	if (phy->hard_fault != 0)
498*4882a593Smuzhiyun 		return IRQ_HANDLED;
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	if (phy->run_mode == PN544_FW_MODE) {
501*4882a593Smuzhiyun 		phy->fw_cmd_result = pn544_hci_i2c_fw_read_status(phy);
502*4882a593Smuzhiyun 		schedule_work(&phy->fw_work);
503*4882a593Smuzhiyun 	} else {
504*4882a593Smuzhiyun 		r = pn544_hci_i2c_read(phy, &skb);
505*4882a593Smuzhiyun 		if (r == -EREMOTEIO) {
506*4882a593Smuzhiyun 			phy->hard_fault = r;
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 			nfc_hci_recv_frame(phy->hdev, NULL);
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun 			return IRQ_HANDLED;
511*4882a593Smuzhiyun 		} else if ((r == -ENOMEM) || (r == -EBADMSG)) {
512*4882a593Smuzhiyun 			return IRQ_HANDLED;
513*4882a593Smuzhiyun 		}
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 		nfc_hci_recv_frame(phy->hdev, skb);
516*4882a593Smuzhiyun 	}
517*4882a593Smuzhiyun 	return IRQ_HANDLED;
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun static struct nfc_phy_ops i2c_phy_ops = {
521*4882a593Smuzhiyun 	.write = pn544_hci_i2c_write,
522*4882a593Smuzhiyun 	.enable = pn544_hci_i2c_enable,
523*4882a593Smuzhiyun 	.disable = pn544_hci_i2c_disable,
524*4882a593Smuzhiyun };
525*4882a593Smuzhiyun 
pn544_hci_i2c_fw_download(void * phy_id,const char * firmware_name,u8 hw_variant)526*4882a593Smuzhiyun static int pn544_hci_i2c_fw_download(void *phy_id, const char *firmware_name,
527*4882a593Smuzhiyun 					u8 hw_variant)
528*4882a593Smuzhiyun {
529*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = phy_id;
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	pr_info("Starting Firmware Download (%s)\n", firmware_name);
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	strcpy(phy->firmware_name, firmware_name);
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun 	phy->hw_variant = hw_variant;
536*4882a593Smuzhiyun 	phy->fw_work_state = FW_WORK_STATE_START;
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun 	schedule_work(&phy->fw_work);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	return 0;
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun 
pn544_hci_i2c_fw_work_complete(struct pn544_i2c_phy * phy,int result)543*4882a593Smuzhiyun static void pn544_hci_i2c_fw_work_complete(struct pn544_i2c_phy *phy,
544*4882a593Smuzhiyun 					   int result)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun 	pr_info("Firmware Download Complete, result=%d\n", result);
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	pn544_hci_i2c_disable(phy);
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	phy->fw_work_state = FW_WORK_STATE_IDLE;
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	if (phy->fw) {
553*4882a593Smuzhiyun 		release_firmware(phy->fw);
554*4882a593Smuzhiyun 		phy->fw = NULL;
555*4882a593Smuzhiyun 	}
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	nfc_fw_download_done(phy->hdev->ndev, phy->firmware_name, (u32) -result);
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun 
pn544_hci_i2c_fw_write_cmd(struct i2c_client * client,u32 dest_addr,const u8 * data,u16 datalen)560*4882a593Smuzhiyun static int pn544_hci_i2c_fw_write_cmd(struct i2c_client *client, u32 dest_addr,
561*4882a593Smuzhiyun 				      const u8 *data, u16 datalen)
562*4882a593Smuzhiyun {
563*4882a593Smuzhiyun 	u8 frame[PN544_FW_I2C_MAX_PAYLOAD];
564*4882a593Smuzhiyun 	struct pn544_i2c_fw_frame_write *framep;
565*4882a593Smuzhiyun 	u16 params_len;
566*4882a593Smuzhiyun 	int framelen;
567*4882a593Smuzhiyun 	int r;
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	if (datalen > PN544_FW_I2C_WRITE_DATA_MAX_LEN)
570*4882a593Smuzhiyun 		datalen = PN544_FW_I2C_WRITE_DATA_MAX_LEN;
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun 	framep = (struct pn544_i2c_fw_frame_write *) frame;
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun 	params_len = sizeof(framep->be_dest_addr) +
575*4882a593Smuzhiyun 		     sizeof(framep->be_datalen) + datalen;
576*4882a593Smuzhiyun 	framelen = params_len + sizeof(framep->cmd) +
577*4882a593Smuzhiyun 			     sizeof(framep->be_length);
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	framep->cmd = PN544_FW_CMD_WRITE;
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	put_unaligned_be16(params_len, &framep->be_length);
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	framep->be_dest_addr[0] = (dest_addr & 0xff0000) >> 16;
584*4882a593Smuzhiyun 	framep->be_dest_addr[1] = (dest_addr & 0xff00) >> 8;
585*4882a593Smuzhiyun 	framep->be_dest_addr[2] = dest_addr & 0xff;
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun 	put_unaligned_be16(datalen, &framep->be_datalen);
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	memcpy(framep->data, data, datalen);
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun 	r = i2c_master_send(client, frame, framelen);
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun 	if (r == framelen)
594*4882a593Smuzhiyun 		return datalen;
595*4882a593Smuzhiyun 	else if (r < 0)
596*4882a593Smuzhiyun 		return r;
597*4882a593Smuzhiyun 	else
598*4882a593Smuzhiyun 		return -EIO;
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun 
pn544_hci_i2c_fw_check_cmd(struct i2c_client * client,u32 start_addr,const u8 * data,u16 datalen)601*4882a593Smuzhiyun static int pn544_hci_i2c_fw_check_cmd(struct i2c_client *client, u32 start_addr,
602*4882a593Smuzhiyun 				      const u8 *data, u16 datalen)
603*4882a593Smuzhiyun {
604*4882a593Smuzhiyun 	struct pn544_i2c_fw_frame_check frame;
605*4882a593Smuzhiyun 	int r;
606*4882a593Smuzhiyun 	u16 crc;
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	/* calculate local crc for the data we want to check */
609*4882a593Smuzhiyun 	crc = crc_ccitt(0xffff, data, datalen);
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	frame.cmd = PN544_FW_CMD_CHECK;
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 	put_unaligned_be16(sizeof(frame.be_start_addr) +
614*4882a593Smuzhiyun 			   sizeof(frame.be_datalen) + sizeof(frame.be_crc),
615*4882a593Smuzhiyun 			   &frame.be_length);
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 	/* tell the chip the memory region to which our crc applies */
618*4882a593Smuzhiyun 	frame.be_start_addr[0] = (start_addr & 0xff0000) >> 16;
619*4882a593Smuzhiyun 	frame.be_start_addr[1] = (start_addr & 0xff00) >> 8;
620*4882a593Smuzhiyun 	frame.be_start_addr[2] = start_addr & 0xff;
621*4882a593Smuzhiyun 
622*4882a593Smuzhiyun 	put_unaligned_be16(datalen, &frame.be_datalen);
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun 	/*
625*4882a593Smuzhiyun 	 * and give our local crc. Chip will calculate its own crc for the
626*4882a593Smuzhiyun 	 * region and compare with ours.
627*4882a593Smuzhiyun 	 */
628*4882a593Smuzhiyun 	put_unaligned_be16(crc, &frame.be_crc);
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	r = i2c_master_send(client, (const char *) &frame, sizeof(frame));
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun 	if (r == sizeof(frame))
633*4882a593Smuzhiyun 		return 0;
634*4882a593Smuzhiyun 	else if (r < 0)
635*4882a593Smuzhiyun 		return r;
636*4882a593Smuzhiyun 	else
637*4882a593Smuzhiyun 		return -EIO;
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun 
pn544_hci_i2c_fw_write_chunk(struct pn544_i2c_phy * phy)640*4882a593Smuzhiyun static int pn544_hci_i2c_fw_write_chunk(struct pn544_i2c_phy *phy)
641*4882a593Smuzhiyun {
642*4882a593Smuzhiyun 	int r;
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	r = pn544_hci_i2c_fw_write_cmd(phy->i2c_dev,
645*4882a593Smuzhiyun 				       phy->fw_blob_dest_addr + phy->fw_written,
646*4882a593Smuzhiyun 				       phy->fw_blob_data + phy->fw_written,
647*4882a593Smuzhiyun 				       phy->fw_blob_size - phy->fw_written);
648*4882a593Smuzhiyun 	if (r < 0)
649*4882a593Smuzhiyun 		return r;
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	phy->fw_written += r;
652*4882a593Smuzhiyun 	phy->fw_work_state = FW_WORK_STATE_WAIT_WRITE_ANSWER;
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun 	return 0;
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun 
pn544_hci_i2c_fw_secure_write_frame_cmd(struct pn544_i2c_phy * phy,const u8 * data,u16 datalen)657*4882a593Smuzhiyun static int pn544_hci_i2c_fw_secure_write_frame_cmd(struct pn544_i2c_phy *phy,
658*4882a593Smuzhiyun 					const u8 *data, u16 datalen)
659*4882a593Smuzhiyun {
660*4882a593Smuzhiyun 	u8 buf[PN544_FW_I2C_MAX_PAYLOAD];
661*4882a593Smuzhiyun 	struct pn544_i2c_fw_secure_frame *chunk;
662*4882a593Smuzhiyun 	int chunklen;
663*4882a593Smuzhiyun 	int r;
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 	if (datalen > PN544_FW_SECURE_CHUNK_WRITE_DATA_MAX_LEN)
666*4882a593Smuzhiyun 		datalen = PN544_FW_SECURE_CHUNK_WRITE_DATA_MAX_LEN;
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun 	chunk = (struct pn544_i2c_fw_secure_frame *) buf;
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	chunk->cmd = PN544_FW_CMD_SECURE_CHUNK_WRITE;
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	put_unaligned_be16(datalen, &chunk->be_datalen);
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 	memcpy(chunk->data, data, datalen);
675*4882a593Smuzhiyun 
676*4882a593Smuzhiyun 	chunklen = sizeof(chunk->cmd) + sizeof(chunk->be_datalen) + datalen;
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	r = i2c_master_send(phy->i2c_dev, buf, chunklen);
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun 	if (r == chunklen)
681*4882a593Smuzhiyun 		return datalen;
682*4882a593Smuzhiyun 	else if (r < 0)
683*4882a593Smuzhiyun 		return r;
684*4882a593Smuzhiyun 	else
685*4882a593Smuzhiyun 		return -EIO;
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun 
pn544_hci_i2c_fw_secure_write_frame(struct pn544_i2c_phy * phy)689*4882a593Smuzhiyun static int pn544_hci_i2c_fw_secure_write_frame(struct pn544_i2c_phy *phy)
690*4882a593Smuzhiyun {
691*4882a593Smuzhiyun 	struct pn544_i2c_fw_secure_frame *framep;
692*4882a593Smuzhiyun 	int r;
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	framep = (struct pn544_i2c_fw_secure_frame *) phy->fw_blob_data;
695*4882a593Smuzhiyun 	if (phy->fw_written == 0)
696*4882a593Smuzhiyun 		phy->fw_blob_size = get_unaligned_be16(&framep->be_datalen)
697*4882a593Smuzhiyun 				+ PN544_FW_SECURE_FRAME_HEADER_LEN;
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 	/* Only secure write command can be chunked*/
700*4882a593Smuzhiyun 	if (phy->fw_blob_size > PN544_FW_I2C_MAX_PAYLOAD &&
701*4882a593Smuzhiyun 			framep->cmd != PN544_FW_CMD_SECURE_WRITE)
702*4882a593Smuzhiyun 		return -EINVAL;
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	/* The firmware also have other commands, we just send them directly */
705*4882a593Smuzhiyun 	if (phy->fw_blob_size < PN544_FW_I2C_MAX_PAYLOAD) {
706*4882a593Smuzhiyun 		r = i2c_master_send(phy->i2c_dev,
707*4882a593Smuzhiyun 			(const char *) phy->fw_blob_data, phy->fw_blob_size);
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 		if (r == phy->fw_blob_size)
710*4882a593Smuzhiyun 			goto exit;
711*4882a593Smuzhiyun 		else if (r < 0)
712*4882a593Smuzhiyun 			return r;
713*4882a593Smuzhiyun 		else
714*4882a593Smuzhiyun 			return -EIO;
715*4882a593Smuzhiyun 	}
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	r = pn544_hci_i2c_fw_secure_write_frame_cmd(phy,
718*4882a593Smuzhiyun 				       phy->fw_blob_data + phy->fw_written,
719*4882a593Smuzhiyun 				       phy->fw_blob_size - phy->fw_written);
720*4882a593Smuzhiyun 	if (r < 0)
721*4882a593Smuzhiyun 		return r;
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun exit:
724*4882a593Smuzhiyun 	phy->fw_written += r;
725*4882a593Smuzhiyun 	phy->fw_work_state = FW_WORK_STATE_WAIT_SECURE_WRITE_ANSWER;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 	/* SW reset command will not trig any response from PN544 */
728*4882a593Smuzhiyun 	if (framep->cmd == PN544_FW_CMD_RESET) {
729*4882a593Smuzhiyun 		pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE);
730*4882a593Smuzhiyun 		phy->fw_cmd_result = 0;
731*4882a593Smuzhiyun 		schedule_work(&phy->fw_work);
732*4882a593Smuzhiyun 	}
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun 	return 0;
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun 
pn544_hci_i2c_fw_work(struct work_struct * work)737*4882a593Smuzhiyun static void pn544_hci_i2c_fw_work(struct work_struct *work)
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = container_of(work, struct pn544_i2c_phy,
740*4882a593Smuzhiyun 						fw_work);
741*4882a593Smuzhiyun 	int r;
742*4882a593Smuzhiyun 	struct pn544_i2c_fw_blob *blob;
743*4882a593Smuzhiyun 	struct pn544_i2c_fw_secure_blob *secure_blob;
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	switch (phy->fw_work_state) {
746*4882a593Smuzhiyun 	case FW_WORK_STATE_START:
747*4882a593Smuzhiyun 		pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE);
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 		r = request_firmware(&phy->fw, phy->firmware_name,
750*4882a593Smuzhiyun 				     &phy->i2c_dev->dev);
751*4882a593Smuzhiyun 		if (r < 0)
752*4882a593Smuzhiyun 			goto exit_state_start;
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun 		phy->fw_written = 0;
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 		switch (phy->hw_variant) {
757*4882a593Smuzhiyun 		case PN544_HW_VARIANT_C2:
758*4882a593Smuzhiyun 			blob = (struct pn544_i2c_fw_blob *) phy->fw->data;
759*4882a593Smuzhiyun 			phy->fw_blob_size = get_unaligned_be32(&blob->be_size);
760*4882a593Smuzhiyun 			phy->fw_blob_dest_addr = get_unaligned_be32(
761*4882a593Smuzhiyun 							&blob->be_destaddr);
762*4882a593Smuzhiyun 			phy->fw_blob_data = blob->data;
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 			r = pn544_hci_i2c_fw_write_chunk(phy);
765*4882a593Smuzhiyun 			break;
766*4882a593Smuzhiyun 		case PN544_HW_VARIANT_C3:
767*4882a593Smuzhiyun 			secure_blob = (struct pn544_i2c_fw_secure_blob *)
768*4882a593Smuzhiyun 								phy->fw->data;
769*4882a593Smuzhiyun 			phy->fw_blob_data = secure_blob->data;
770*4882a593Smuzhiyun 			phy->fw_size = phy->fw->size;
771*4882a593Smuzhiyun 			r = pn544_hci_i2c_fw_secure_write_frame(phy);
772*4882a593Smuzhiyun 			break;
773*4882a593Smuzhiyun 		default:
774*4882a593Smuzhiyun 			r = -ENOTSUPP;
775*4882a593Smuzhiyun 			break;
776*4882a593Smuzhiyun 		}
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun exit_state_start:
779*4882a593Smuzhiyun 		if (r < 0)
780*4882a593Smuzhiyun 			pn544_hci_i2c_fw_work_complete(phy, r);
781*4882a593Smuzhiyun 		break;
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 	case FW_WORK_STATE_WAIT_WRITE_ANSWER:
784*4882a593Smuzhiyun 		r = phy->fw_cmd_result;
785*4882a593Smuzhiyun 		if (r < 0)
786*4882a593Smuzhiyun 			goto exit_state_wait_write_answer;
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 		if (phy->fw_written == phy->fw_blob_size) {
789*4882a593Smuzhiyun 			r = pn544_hci_i2c_fw_check_cmd(phy->i2c_dev,
790*4882a593Smuzhiyun 						       phy->fw_blob_dest_addr,
791*4882a593Smuzhiyun 						       phy->fw_blob_data,
792*4882a593Smuzhiyun 						       phy->fw_blob_size);
793*4882a593Smuzhiyun 			if (r < 0)
794*4882a593Smuzhiyun 				goto exit_state_wait_write_answer;
795*4882a593Smuzhiyun 			phy->fw_work_state = FW_WORK_STATE_WAIT_CHECK_ANSWER;
796*4882a593Smuzhiyun 			break;
797*4882a593Smuzhiyun 		}
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun 		r = pn544_hci_i2c_fw_write_chunk(phy);
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun exit_state_wait_write_answer:
802*4882a593Smuzhiyun 		if (r < 0)
803*4882a593Smuzhiyun 			pn544_hci_i2c_fw_work_complete(phy, r);
804*4882a593Smuzhiyun 		break;
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun 	case FW_WORK_STATE_WAIT_CHECK_ANSWER:
807*4882a593Smuzhiyun 		r = phy->fw_cmd_result;
808*4882a593Smuzhiyun 		if (r < 0)
809*4882a593Smuzhiyun 			goto exit_state_wait_check_answer;
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 		blob = (struct pn544_i2c_fw_blob *) (phy->fw_blob_data +
812*4882a593Smuzhiyun 		       phy->fw_blob_size);
813*4882a593Smuzhiyun 		phy->fw_blob_size = get_unaligned_be32(&blob->be_size);
814*4882a593Smuzhiyun 		if (phy->fw_blob_size != 0) {
815*4882a593Smuzhiyun 			phy->fw_blob_dest_addr =
816*4882a593Smuzhiyun 					get_unaligned_be32(&blob->be_destaddr);
817*4882a593Smuzhiyun 			phy->fw_blob_data = blob->data;
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 			phy->fw_written = 0;
820*4882a593Smuzhiyun 			r = pn544_hci_i2c_fw_write_chunk(phy);
821*4882a593Smuzhiyun 		}
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun exit_state_wait_check_answer:
824*4882a593Smuzhiyun 		if (r < 0 || phy->fw_blob_size == 0)
825*4882a593Smuzhiyun 			pn544_hci_i2c_fw_work_complete(phy, r);
826*4882a593Smuzhiyun 		break;
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun 	case FW_WORK_STATE_WAIT_SECURE_WRITE_ANSWER:
829*4882a593Smuzhiyun 		r = phy->fw_cmd_result;
830*4882a593Smuzhiyun 		if (r < 0)
831*4882a593Smuzhiyun 			goto exit_state_wait_secure_write_answer;
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun 		if (r == PN544_FW_CMD_RESULT_CHUNK_OK) {
834*4882a593Smuzhiyun 			r = pn544_hci_i2c_fw_secure_write_frame(phy);
835*4882a593Smuzhiyun 			goto exit_state_wait_secure_write_answer;
836*4882a593Smuzhiyun 		}
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun 		if (phy->fw_written == phy->fw_blob_size) {
839*4882a593Smuzhiyun 			secure_blob = (struct pn544_i2c_fw_secure_blob *)
840*4882a593Smuzhiyun 				(phy->fw_blob_data + phy->fw_blob_size);
841*4882a593Smuzhiyun 			phy->fw_size -= phy->fw_blob_size +
842*4882a593Smuzhiyun 				PN544_FW_SECURE_BLOB_HEADER_LEN;
843*4882a593Smuzhiyun 			if (phy->fw_size >= PN544_FW_SECURE_BLOB_HEADER_LEN
844*4882a593Smuzhiyun 					+ PN544_FW_SECURE_FRAME_HEADER_LEN) {
845*4882a593Smuzhiyun 				phy->fw_blob_data = secure_blob->data;
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 				phy->fw_written = 0;
848*4882a593Smuzhiyun 				r = pn544_hci_i2c_fw_secure_write_frame(phy);
849*4882a593Smuzhiyun 			}
850*4882a593Smuzhiyun 		}
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun exit_state_wait_secure_write_answer:
853*4882a593Smuzhiyun 		if (r < 0 || phy->fw_size == 0)
854*4882a593Smuzhiyun 			pn544_hci_i2c_fw_work_complete(phy, r);
855*4882a593Smuzhiyun 		break;
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun 	default:
858*4882a593Smuzhiyun 		break;
859*4882a593Smuzhiyun 	}
860*4882a593Smuzhiyun }
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun static const struct acpi_gpio_params enable_gpios = { 1, 0, false };
863*4882a593Smuzhiyun static const struct acpi_gpio_params firmware_gpios = { 2, 0, false };
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun static const struct acpi_gpio_mapping acpi_pn544_gpios[] = {
866*4882a593Smuzhiyun 	{ "enable-gpios", &enable_gpios, 1 },
867*4882a593Smuzhiyun 	{ "firmware-gpios", &firmware_gpios, 1 },
868*4882a593Smuzhiyun 	{ },
869*4882a593Smuzhiyun };
870*4882a593Smuzhiyun 
pn544_hci_i2c_probe(struct i2c_client * client,const struct i2c_device_id * id)871*4882a593Smuzhiyun static int pn544_hci_i2c_probe(struct i2c_client *client,
872*4882a593Smuzhiyun 			       const struct i2c_device_id *id)
873*4882a593Smuzhiyun {
874*4882a593Smuzhiyun 	struct device *dev = &client->dev;
875*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy;
876*4882a593Smuzhiyun 	int r = 0;
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun 	dev_dbg(&client->dev, "%s\n", __func__);
879*4882a593Smuzhiyun 	dev_dbg(&client->dev, "IRQ: %d\n", client->irq);
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
882*4882a593Smuzhiyun 		nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
883*4882a593Smuzhiyun 		return -ENODEV;
884*4882a593Smuzhiyun 	}
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun 	phy = devm_kzalloc(&client->dev, sizeof(struct pn544_i2c_phy),
887*4882a593Smuzhiyun 			   GFP_KERNEL);
888*4882a593Smuzhiyun 	if (!phy)
889*4882a593Smuzhiyun 		return -ENOMEM;
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun 	INIT_WORK(&phy->fw_work, pn544_hci_i2c_fw_work);
892*4882a593Smuzhiyun 	phy->fw_work_state = FW_WORK_STATE_IDLE;
893*4882a593Smuzhiyun 
894*4882a593Smuzhiyun 	phy->i2c_dev = client;
895*4882a593Smuzhiyun 	i2c_set_clientdata(client, phy);
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun 	r = devm_acpi_dev_add_driver_gpios(dev, acpi_pn544_gpios);
898*4882a593Smuzhiyun 	if (r)
899*4882a593Smuzhiyun 		dev_dbg(dev, "Unable to add GPIO mapping table\n");
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun 	/* Get EN GPIO */
902*4882a593Smuzhiyun 	phy->gpiod_en = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
903*4882a593Smuzhiyun 	if (IS_ERR(phy->gpiod_en)) {
904*4882a593Smuzhiyun 		nfc_err(dev, "Unable to get EN GPIO\n");
905*4882a593Smuzhiyun 		return PTR_ERR(phy->gpiod_en);
906*4882a593Smuzhiyun 	}
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun 	/* Get FW GPIO */
909*4882a593Smuzhiyun 	phy->gpiod_fw = devm_gpiod_get(dev, "firmware", GPIOD_OUT_LOW);
910*4882a593Smuzhiyun 	if (IS_ERR(phy->gpiod_fw)) {
911*4882a593Smuzhiyun 		nfc_err(dev, "Unable to get FW GPIO\n");
912*4882a593Smuzhiyun 		return PTR_ERR(phy->gpiod_fw);
913*4882a593Smuzhiyun 	}
914*4882a593Smuzhiyun 
915*4882a593Smuzhiyun 	pn544_hci_i2c_platform_init(phy);
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun 	r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
918*4882a593Smuzhiyun 				      pn544_hci_i2c_irq_thread_fn,
919*4882a593Smuzhiyun 				      IRQF_TRIGGER_RISING | IRQF_ONESHOT,
920*4882a593Smuzhiyun 				      PN544_HCI_I2C_DRIVER_NAME, phy);
921*4882a593Smuzhiyun 	if (r < 0) {
922*4882a593Smuzhiyun 		nfc_err(&client->dev, "Unable to register IRQ handler\n");
923*4882a593Smuzhiyun 		return r;
924*4882a593Smuzhiyun 	}
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun 	r = pn544_hci_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME,
927*4882a593Smuzhiyun 			    PN544_I2C_FRAME_HEADROOM, PN544_I2C_FRAME_TAILROOM,
928*4882a593Smuzhiyun 			    PN544_HCI_I2C_LLC_MAX_PAYLOAD,
929*4882a593Smuzhiyun 			    pn544_hci_i2c_fw_download, &phy->hdev);
930*4882a593Smuzhiyun 	if (r < 0)
931*4882a593Smuzhiyun 		return r;
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	return 0;
934*4882a593Smuzhiyun }
935*4882a593Smuzhiyun 
pn544_hci_i2c_remove(struct i2c_client * client)936*4882a593Smuzhiyun static int pn544_hci_i2c_remove(struct i2c_client *client)
937*4882a593Smuzhiyun {
938*4882a593Smuzhiyun 	struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	dev_dbg(&client->dev, "%s\n", __func__);
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	cancel_work_sync(&phy->fw_work);
943*4882a593Smuzhiyun 	if (phy->fw_work_state != FW_WORK_STATE_IDLE)
944*4882a593Smuzhiyun 		pn544_hci_i2c_fw_work_complete(phy, -ENODEV);
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	pn544_hci_remove(phy->hdev);
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 	if (phy->powered)
949*4882a593Smuzhiyun 		pn544_hci_i2c_disable(phy);
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun 	return 0;
952*4882a593Smuzhiyun }
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun static const struct of_device_id of_pn544_i2c_match[] = {
955*4882a593Smuzhiyun 	{ .compatible = "nxp,pn544-i2c", },
956*4882a593Smuzhiyun 	{},
957*4882a593Smuzhiyun };
958*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, of_pn544_i2c_match);
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun static struct i2c_driver pn544_hci_i2c_driver = {
961*4882a593Smuzhiyun 	.driver = {
962*4882a593Smuzhiyun 		   .name = PN544_HCI_I2C_DRIVER_NAME,
963*4882a593Smuzhiyun 		   .of_match_table = of_match_ptr(of_pn544_i2c_match),
964*4882a593Smuzhiyun 		   .acpi_match_table = ACPI_PTR(pn544_hci_i2c_acpi_match),
965*4882a593Smuzhiyun 		  },
966*4882a593Smuzhiyun 	.probe = pn544_hci_i2c_probe,
967*4882a593Smuzhiyun 	.id_table = pn544_hci_i2c_id_table,
968*4882a593Smuzhiyun 	.remove = pn544_hci_i2c_remove,
969*4882a593Smuzhiyun };
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun module_i2c_driver(pn544_hci_i2c_driver);
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun MODULE_LICENSE("GPL");
974*4882a593Smuzhiyun MODULE_DESCRIPTION(DRIVER_DESC);
975