xref: /OK3568_Linux_fs/kernel/drivers/nfc/microread/i2c.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * HCI based Driver for Inside Secure microread NFC Chip - i2c layer
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2013 Intel Corporation. All rights reserved.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/i2c.h>
12*4882a593Smuzhiyun #include <linux/delay.h>
13*4882a593Smuzhiyun #include <linux/slab.h>
14*4882a593Smuzhiyun #include <linux/interrupt.h>
15*4882a593Smuzhiyun #include <linux/gpio.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/nfc.h>
18*4882a593Smuzhiyun #include <net/nfc/hci.h>
19*4882a593Smuzhiyun #include <net/nfc/llc.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "microread.h"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define MICROREAD_I2C_DRIVER_NAME "microread"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define MICROREAD_I2C_FRAME_HEADROOM 1
26*4882a593Smuzhiyun #define MICROREAD_I2C_FRAME_TAILROOM 1
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* framing in HCI mode */
29*4882a593Smuzhiyun #define MICROREAD_I2C_LLC_LEN		1
30*4882a593Smuzhiyun #define MICROREAD_I2C_LLC_CRC		1
31*4882a593Smuzhiyun #define MICROREAD_I2C_LLC_LEN_CRC	(MICROREAD_I2C_LLC_LEN + \
32*4882a593Smuzhiyun 					MICROREAD_I2C_LLC_CRC)
33*4882a593Smuzhiyun #define MICROREAD_I2C_LLC_MIN_SIZE	(1 + MICROREAD_I2C_LLC_LEN_CRC)
34*4882a593Smuzhiyun #define MICROREAD_I2C_LLC_MAX_PAYLOAD	29
35*4882a593Smuzhiyun #define MICROREAD_I2C_LLC_MAX_SIZE	(MICROREAD_I2C_LLC_LEN_CRC + 1 + \
36*4882a593Smuzhiyun 					MICROREAD_I2C_LLC_MAX_PAYLOAD)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun struct microread_i2c_phy {
39*4882a593Smuzhiyun 	struct i2c_client *i2c_dev;
40*4882a593Smuzhiyun 	struct nfc_hci_dev *hdev;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	int hard_fault;		/*
43*4882a593Smuzhiyun 				 * < 0 if hardware error occured (e.g. i2c err)
44*4882a593Smuzhiyun 				 * and prevents normal operation.
45*4882a593Smuzhiyun 				 */
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define I2C_DUMP_SKB(info, skb)					\
49*4882a593Smuzhiyun do {								\
50*4882a593Smuzhiyun 	pr_debug("%s:\n", info);				\
51*4882a593Smuzhiyun 	print_hex_dump(KERN_DEBUG, "i2c: ", DUMP_PREFIX_OFFSET,	\
52*4882a593Smuzhiyun 		       16, 1, (skb)->data, (skb)->len, 0);	\
53*4882a593Smuzhiyun } while (0)
54*4882a593Smuzhiyun 
microread_i2c_add_len_crc(struct sk_buff * skb)55*4882a593Smuzhiyun static void microread_i2c_add_len_crc(struct sk_buff *skb)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	int i;
58*4882a593Smuzhiyun 	u8 crc = 0;
59*4882a593Smuzhiyun 	int len;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	len = skb->len;
62*4882a593Smuzhiyun 	*(u8 *)skb_push(skb, 1) = len;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	for (i = 0; i < skb->len; i++)
65*4882a593Smuzhiyun 		crc = crc ^ skb->data[i];
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	skb_put_u8(skb, crc);
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
microread_i2c_remove_len_crc(struct sk_buff * skb)70*4882a593Smuzhiyun static void microread_i2c_remove_len_crc(struct sk_buff *skb)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	skb_pull(skb, MICROREAD_I2C_FRAME_HEADROOM);
73*4882a593Smuzhiyun 	skb_trim(skb, MICROREAD_I2C_FRAME_TAILROOM);
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
check_crc(struct sk_buff * skb)76*4882a593Smuzhiyun static int check_crc(struct sk_buff *skb)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun 	int i;
79*4882a593Smuzhiyun 	u8 crc = 0;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	for (i = 0; i < skb->len - 1; i++)
82*4882a593Smuzhiyun 		crc = crc ^ skb->data[i];
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	if (crc != skb->data[skb->len-1]) {
85*4882a593Smuzhiyun 		pr_err("CRC error 0x%x != 0x%x\n", crc, skb->data[skb->len-1]);
86*4882a593Smuzhiyun 		pr_info("%s: BAD CRC\n", __func__);
87*4882a593Smuzhiyun 		return -EPERM;
88*4882a593Smuzhiyun 	}
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	return 0;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun 
microread_i2c_enable(void * phy_id)93*4882a593Smuzhiyun static int microread_i2c_enable(void *phy_id)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	return 0;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
microread_i2c_disable(void * phy_id)98*4882a593Smuzhiyun static void microread_i2c_disable(void *phy_id)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	return;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
microread_i2c_write(void * phy_id,struct sk_buff * skb)103*4882a593Smuzhiyun static int microread_i2c_write(void *phy_id, struct sk_buff *skb)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun 	int r;
106*4882a593Smuzhiyun 	struct microread_i2c_phy *phy = phy_id;
107*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	if (phy->hard_fault != 0)
110*4882a593Smuzhiyun 		return phy->hard_fault;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	usleep_range(3000, 6000);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	microread_i2c_add_len_crc(skb);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	I2C_DUMP_SKB("i2c frame written", skb);
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	r = i2c_master_send(client, skb->data, skb->len);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	if (r == -EREMOTEIO) {	/* Retry, chip was in standby */
121*4882a593Smuzhiyun 		usleep_range(6000, 10000);
122*4882a593Smuzhiyun 		r = i2c_master_send(client, skb->data, skb->len);
123*4882a593Smuzhiyun 	}
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	if (r >= 0) {
126*4882a593Smuzhiyun 		if (r != skb->len)
127*4882a593Smuzhiyun 			r = -EREMOTEIO;
128*4882a593Smuzhiyun 		else
129*4882a593Smuzhiyun 			r = 0;
130*4882a593Smuzhiyun 	}
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	microread_i2c_remove_len_crc(skb);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	return r;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 
microread_i2c_read(struct microread_i2c_phy * phy,struct sk_buff ** skb)138*4882a593Smuzhiyun static int microread_i2c_read(struct microread_i2c_phy *phy,
139*4882a593Smuzhiyun 			      struct sk_buff **skb)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	int r;
142*4882a593Smuzhiyun 	u8 len;
143*4882a593Smuzhiyun 	u8 tmp[MICROREAD_I2C_LLC_MAX_SIZE - 1];
144*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	r = i2c_master_recv(client, &len, 1);
147*4882a593Smuzhiyun 	if (r != 1) {
148*4882a593Smuzhiyun 		nfc_err(&client->dev, "cannot read len byte\n");
149*4882a593Smuzhiyun 		return -EREMOTEIO;
150*4882a593Smuzhiyun 	}
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	if ((len < MICROREAD_I2C_LLC_MIN_SIZE) ||
153*4882a593Smuzhiyun 	    (len > MICROREAD_I2C_LLC_MAX_SIZE)) {
154*4882a593Smuzhiyun 		nfc_err(&client->dev, "invalid len byte\n");
155*4882a593Smuzhiyun 		r = -EBADMSG;
156*4882a593Smuzhiyun 		goto flush;
157*4882a593Smuzhiyun 	}
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	*skb = alloc_skb(1 + len, GFP_KERNEL);
160*4882a593Smuzhiyun 	if (*skb == NULL) {
161*4882a593Smuzhiyun 		r = -ENOMEM;
162*4882a593Smuzhiyun 		goto flush;
163*4882a593Smuzhiyun 	}
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	skb_put_u8(*skb, len);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	r = i2c_master_recv(client, skb_put(*skb, len), len);
168*4882a593Smuzhiyun 	if (r != len) {
169*4882a593Smuzhiyun 		kfree_skb(*skb);
170*4882a593Smuzhiyun 		return -EREMOTEIO;
171*4882a593Smuzhiyun 	}
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	I2C_DUMP_SKB("cc frame read", *skb);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	r = check_crc(*skb);
176*4882a593Smuzhiyun 	if (r != 0) {
177*4882a593Smuzhiyun 		kfree_skb(*skb);
178*4882a593Smuzhiyun 		r = -EBADMSG;
179*4882a593Smuzhiyun 		goto flush;
180*4882a593Smuzhiyun 	}
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	skb_pull(*skb, 1);
183*4882a593Smuzhiyun 	skb_trim(*skb, (*skb)->len - MICROREAD_I2C_FRAME_TAILROOM);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	usleep_range(3000, 6000);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	return 0;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun flush:
190*4882a593Smuzhiyun 	if (i2c_master_recv(client, tmp, sizeof(tmp)) < 0)
191*4882a593Smuzhiyun 		r = -EREMOTEIO;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	usleep_range(3000, 6000);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	return r;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
microread_i2c_irq_thread_fn(int irq,void * phy_id)198*4882a593Smuzhiyun static irqreturn_t microread_i2c_irq_thread_fn(int irq, void *phy_id)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	struct microread_i2c_phy *phy = phy_id;
201*4882a593Smuzhiyun 	struct sk_buff *skb = NULL;
202*4882a593Smuzhiyun 	int r;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	if (!phy || irq != phy->i2c_dev->irq) {
205*4882a593Smuzhiyun 		WARN_ON_ONCE(1);
206*4882a593Smuzhiyun 		return IRQ_NONE;
207*4882a593Smuzhiyun 	}
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	if (phy->hard_fault != 0)
210*4882a593Smuzhiyun 		return IRQ_HANDLED;
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	r = microread_i2c_read(phy, &skb);
213*4882a593Smuzhiyun 	if (r == -EREMOTEIO) {
214*4882a593Smuzhiyun 		phy->hard_fault = r;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 		nfc_hci_recv_frame(phy->hdev, NULL);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 		return IRQ_HANDLED;
219*4882a593Smuzhiyun 	} else if ((r == -ENOMEM) || (r == -EBADMSG)) {
220*4882a593Smuzhiyun 		return IRQ_HANDLED;
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	nfc_hci_recv_frame(phy->hdev, skb);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	return IRQ_HANDLED;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun static struct nfc_phy_ops i2c_phy_ops = {
229*4882a593Smuzhiyun 	.write = microread_i2c_write,
230*4882a593Smuzhiyun 	.enable = microread_i2c_enable,
231*4882a593Smuzhiyun 	.disable = microread_i2c_disable,
232*4882a593Smuzhiyun };
233*4882a593Smuzhiyun 
microread_i2c_probe(struct i2c_client * client,const struct i2c_device_id * id)234*4882a593Smuzhiyun static int microread_i2c_probe(struct i2c_client *client,
235*4882a593Smuzhiyun 			       const struct i2c_device_id *id)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	struct microread_i2c_phy *phy;
238*4882a593Smuzhiyun 	int r;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	dev_dbg(&client->dev, "client %p\n", client);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	phy = devm_kzalloc(&client->dev, sizeof(struct microread_i2c_phy),
243*4882a593Smuzhiyun 			   GFP_KERNEL);
244*4882a593Smuzhiyun 	if (!phy)
245*4882a593Smuzhiyun 		return -ENOMEM;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	i2c_set_clientdata(client, phy);
248*4882a593Smuzhiyun 	phy->i2c_dev = client;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	r = request_threaded_irq(client->irq, NULL, microread_i2c_irq_thread_fn,
251*4882a593Smuzhiyun 				 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
252*4882a593Smuzhiyun 				 MICROREAD_I2C_DRIVER_NAME, phy);
253*4882a593Smuzhiyun 	if (r) {
254*4882a593Smuzhiyun 		nfc_err(&client->dev, "Unable to register IRQ handler\n");
255*4882a593Smuzhiyun 		return r;
256*4882a593Smuzhiyun 	}
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	r = microread_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME,
259*4882a593Smuzhiyun 			    MICROREAD_I2C_FRAME_HEADROOM,
260*4882a593Smuzhiyun 			    MICROREAD_I2C_FRAME_TAILROOM,
261*4882a593Smuzhiyun 			    MICROREAD_I2C_LLC_MAX_PAYLOAD, &phy->hdev);
262*4882a593Smuzhiyun 	if (r < 0)
263*4882a593Smuzhiyun 		goto err_irq;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	nfc_info(&client->dev, "Probed\n");
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	return 0;
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun err_irq:
270*4882a593Smuzhiyun 	free_irq(client->irq, phy);
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	return r;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
microread_i2c_remove(struct i2c_client * client)275*4882a593Smuzhiyun static int microread_i2c_remove(struct i2c_client *client)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun 	struct microread_i2c_phy *phy = i2c_get_clientdata(client);
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	microread_remove(phy->hdev);
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	free_irq(client->irq, phy);
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	return 0;
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun static const struct i2c_device_id microread_i2c_id[] = {
287*4882a593Smuzhiyun 	{ MICROREAD_I2C_DRIVER_NAME, 0},
288*4882a593Smuzhiyun 	{ }
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, microread_i2c_id);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static struct i2c_driver microread_i2c_driver = {
293*4882a593Smuzhiyun 	.driver = {
294*4882a593Smuzhiyun 		.name = MICROREAD_I2C_DRIVER_NAME,
295*4882a593Smuzhiyun 	},
296*4882a593Smuzhiyun 	.probe		= microread_i2c_probe,
297*4882a593Smuzhiyun 	.remove		= microread_i2c_remove,
298*4882a593Smuzhiyun 	.id_table	= microread_i2c_id,
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun module_i2c_driver(microread_i2c_driver);
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun MODULE_LICENSE("GPL");
304*4882a593Smuzhiyun MODULE_DESCRIPTION(DRIVER_DESC);
305