xref: /OK3568_Linux_fs/kernel/drivers/nfc/st-nci/i2c.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * I2C Link Layer for ST NCI NFC controller familly based Driver
4*4882a593Smuzhiyun  * Copyright (C) 2014-2015 STMicroelectronics SAS. All rights reserved.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/i2c.h>
11*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
12*4882a593Smuzhiyun #include <linux/acpi.h>
13*4882a593Smuzhiyun #include <linux/interrupt.h>
14*4882a593Smuzhiyun #include <linux/delay.h>
15*4882a593Smuzhiyun #include <linux/nfc.h>
16*4882a593Smuzhiyun #include <linux/of.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "st-nci.h"
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define DRIVER_DESC "NCI NFC driver for ST_NCI"
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /* ndlc header */
23*4882a593Smuzhiyun #define ST_NCI_FRAME_HEADROOM 1
24*4882a593Smuzhiyun #define ST_NCI_FRAME_TAILROOM 0
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define ST_NCI_I2C_MIN_SIZE 4   /* PCB(1) + NCI Packet header(3) */
27*4882a593Smuzhiyun #define ST_NCI_I2C_MAX_SIZE 250 /* req 4.2.1 */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define ST_NCI_DRIVER_NAME "st_nci"
30*4882a593Smuzhiyun #define ST_NCI_I2C_DRIVER_NAME "st_nci_i2c"
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun struct st_nci_i2c_phy {
33*4882a593Smuzhiyun 	struct i2c_client *i2c_dev;
34*4882a593Smuzhiyun 	struct llt_ndlc *ndlc;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	bool irq_active;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	struct gpio_desc *gpiod_reset;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	struct st_nci_se_status se_status;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
st_nci_i2c_enable(void * phy_id)43*4882a593Smuzhiyun static int st_nci_i2c_enable(void *phy_id)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	struct st_nci_i2c_phy *phy = phy_id;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	gpiod_set_value(phy->gpiod_reset, 0);
48*4882a593Smuzhiyun 	usleep_range(10000, 15000);
49*4882a593Smuzhiyun 	gpiod_set_value(phy->gpiod_reset, 1);
50*4882a593Smuzhiyun 	usleep_range(80000, 85000);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	if (phy->ndlc->powered == 0 && phy->irq_active == 0) {
53*4882a593Smuzhiyun 		enable_irq(phy->i2c_dev->irq);
54*4882a593Smuzhiyun 		phy->irq_active = true;
55*4882a593Smuzhiyun 	}
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	return 0;
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
st_nci_i2c_disable(void * phy_id)60*4882a593Smuzhiyun static void st_nci_i2c_disable(void *phy_id)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	struct st_nci_i2c_phy *phy = phy_id;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	disable_irq_nosync(phy->i2c_dev->irq);
65*4882a593Smuzhiyun 	phy->irq_active = false;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /*
69*4882a593Smuzhiyun  * Writing a frame must not return the number of written bytes.
70*4882a593Smuzhiyun  * It must return either zero for success, or <0 for error.
71*4882a593Smuzhiyun  * In addition, it must not alter the skb
72*4882a593Smuzhiyun  */
st_nci_i2c_write(void * phy_id,struct sk_buff * skb)73*4882a593Smuzhiyun static int st_nci_i2c_write(void *phy_id, struct sk_buff *skb)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun 	int r;
76*4882a593Smuzhiyun 	struct st_nci_i2c_phy *phy = phy_id;
77*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	if (phy->ndlc->hard_fault != 0)
80*4882a593Smuzhiyun 		return phy->ndlc->hard_fault;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	r = i2c_master_send(client, skb->data, skb->len);
83*4882a593Smuzhiyun 	if (r < 0) {  /* Retry, chip was in standby */
84*4882a593Smuzhiyun 		usleep_range(1000, 4000);
85*4882a593Smuzhiyun 		r = i2c_master_send(client, skb->data, skb->len);
86*4882a593Smuzhiyun 	}
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	if (r >= 0) {
89*4882a593Smuzhiyun 		if (r != skb->len)
90*4882a593Smuzhiyun 			r = -EREMOTEIO;
91*4882a593Smuzhiyun 		else
92*4882a593Smuzhiyun 			r = 0;
93*4882a593Smuzhiyun 	}
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	return r;
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /*
99*4882a593Smuzhiyun  * Reads an ndlc frame and returns it in a newly allocated sk_buff.
100*4882a593Smuzhiyun  * returns:
101*4882a593Smuzhiyun  * 0 : if received frame is complete
102*4882a593Smuzhiyun  * -EREMOTEIO : i2c read error (fatal)
103*4882a593Smuzhiyun  * -EBADMSG : frame was incorrect and discarded
104*4882a593Smuzhiyun  * -ENOMEM : cannot allocate skb, frame dropped
105*4882a593Smuzhiyun  */
st_nci_i2c_read(struct st_nci_i2c_phy * phy,struct sk_buff ** skb)106*4882a593Smuzhiyun static int st_nci_i2c_read(struct st_nci_i2c_phy *phy,
107*4882a593Smuzhiyun 				 struct sk_buff **skb)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	int r;
110*4882a593Smuzhiyun 	u8 len;
111*4882a593Smuzhiyun 	u8 buf[ST_NCI_I2C_MAX_SIZE];
112*4882a593Smuzhiyun 	struct i2c_client *client = phy->i2c_dev;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	r = i2c_master_recv(client, buf, ST_NCI_I2C_MIN_SIZE);
115*4882a593Smuzhiyun 	if (r < 0) {  /* Retry, chip was in standby */
116*4882a593Smuzhiyun 		usleep_range(1000, 4000);
117*4882a593Smuzhiyun 		r = i2c_master_recv(client, buf, ST_NCI_I2C_MIN_SIZE);
118*4882a593Smuzhiyun 	}
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	if (r != ST_NCI_I2C_MIN_SIZE)
121*4882a593Smuzhiyun 		return -EREMOTEIO;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	len = be16_to_cpu(*(__be16 *) (buf + 2));
124*4882a593Smuzhiyun 	if (len > ST_NCI_I2C_MAX_SIZE) {
125*4882a593Smuzhiyun 		nfc_err(&client->dev, "invalid frame len\n");
126*4882a593Smuzhiyun 		return -EBADMSG;
127*4882a593Smuzhiyun 	}
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	*skb = alloc_skb(ST_NCI_I2C_MIN_SIZE + len, GFP_KERNEL);
130*4882a593Smuzhiyun 	if (*skb == NULL)
131*4882a593Smuzhiyun 		return -ENOMEM;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	skb_reserve(*skb, ST_NCI_I2C_MIN_SIZE);
134*4882a593Smuzhiyun 	skb_put(*skb, ST_NCI_I2C_MIN_SIZE);
135*4882a593Smuzhiyun 	memcpy((*skb)->data, buf, ST_NCI_I2C_MIN_SIZE);
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	if (!len)
138*4882a593Smuzhiyun 		return 0;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	r = i2c_master_recv(client, buf, len);
141*4882a593Smuzhiyun 	if (r != len) {
142*4882a593Smuzhiyun 		kfree_skb(*skb);
143*4882a593Smuzhiyun 		return -EREMOTEIO;
144*4882a593Smuzhiyun 	}
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	skb_put(*skb, len);
147*4882a593Smuzhiyun 	memcpy((*skb)->data + ST_NCI_I2C_MIN_SIZE, buf, len);
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	return 0;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /*
153*4882a593Smuzhiyun  * Reads an ndlc frame from the chip.
154*4882a593Smuzhiyun  *
155*4882a593Smuzhiyun  * On ST_NCI, IRQ goes in idle state when read starts.
156*4882a593Smuzhiyun  */
st_nci_irq_thread_fn(int irq,void * phy_id)157*4882a593Smuzhiyun static irqreturn_t st_nci_irq_thread_fn(int irq, void *phy_id)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	struct st_nci_i2c_phy *phy = phy_id;
160*4882a593Smuzhiyun 	struct i2c_client *client;
161*4882a593Smuzhiyun 	struct sk_buff *skb = NULL;
162*4882a593Smuzhiyun 	int r;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	if (!phy || !phy->ndlc || irq != phy->i2c_dev->irq) {
165*4882a593Smuzhiyun 		WARN_ON_ONCE(1);
166*4882a593Smuzhiyun 		return IRQ_NONE;
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	client = phy->i2c_dev;
170*4882a593Smuzhiyun 	dev_dbg(&client->dev, "IRQ\n");
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	if (phy->ndlc->hard_fault)
173*4882a593Smuzhiyun 		return IRQ_HANDLED;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	if (!phy->ndlc->powered) {
176*4882a593Smuzhiyun 		st_nci_i2c_disable(phy);
177*4882a593Smuzhiyun 		return IRQ_HANDLED;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	r = st_nci_i2c_read(phy, &skb);
181*4882a593Smuzhiyun 	if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG)
182*4882a593Smuzhiyun 		return IRQ_HANDLED;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	ndlc_recv(phy->ndlc, skb);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	return IRQ_HANDLED;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun static struct nfc_phy_ops i2c_phy_ops = {
190*4882a593Smuzhiyun 	.write = st_nci_i2c_write,
191*4882a593Smuzhiyun 	.enable = st_nci_i2c_enable,
192*4882a593Smuzhiyun 	.disable = st_nci_i2c_disable,
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun static const struct acpi_gpio_params reset_gpios = { 1, 0, false };
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun static const struct acpi_gpio_mapping acpi_st_nci_gpios[] = {
198*4882a593Smuzhiyun 	{ "reset-gpios", &reset_gpios, 1 },
199*4882a593Smuzhiyun 	{},
200*4882a593Smuzhiyun };
201*4882a593Smuzhiyun 
st_nci_i2c_probe(struct i2c_client * client,const struct i2c_device_id * id)202*4882a593Smuzhiyun static int st_nci_i2c_probe(struct i2c_client *client,
203*4882a593Smuzhiyun 				  const struct i2c_device_id *id)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	struct device *dev = &client->dev;
206*4882a593Smuzhiyun 	struct st_nci_i2c_phy *phy;
207*4882a593Smuzhiyun 	int r;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	dev_dbg(&client->dev, "%s\n", __func__);
210*4882a593Smuzhiyun 	dev_dbg(&client->dev, "IRQ: %d\n", client->irq);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
213*4882a593Smuzhiyun 		nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
214*4882a593Smuzhiyun 		return -ENODEV;
215*4882a593Smuzhiyun 	}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	phy = devm_kzalloc(dev, sizeof(struct st_nci_i2c_phy), GFP_KERNEL);
218*4882a593Smuzhiyun 	if (!phy)
219*4882a593Smuzhiyun 		return -ENOMEM;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	phy->i2c_dev = client;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	i2c_set_clientdata(client, phy);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	r = devm_acpi_dev_add_driver_gpios(dev, acpi_st_nci_gpios);
226*4882a593Smuzhiyun 	if (r)
227*4882a593Smuzhiyun 		dev_dbg(dev, "Unable to add GPIO mapping table\n");
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	/* Get RESET GPIO */
230*4882a593Smuzhiyun 	phy->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
231*4882a593Smuzhiyun 	if (IS_ERR(phy->gpiod_reset)) {
232*4882a593Smuzhiyun 		nfc_err(dev, "Unable to get RESET GPIO\n");
233*4882a593Smuzhiyun 		return -ENODEV;
234*4882a593Smuzhiyun 	}
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	phy->se_status.is_ese_present =
237*4882a593Smuzhiyun 				device_property_read_bool(dev, "ese-present");
238*4882a593Smuzhiyun 	phy->se_status.is_uicc_present =
239*4882a593Smuzhiyun 				device_property_read_bool(dev, "uicc-present");
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	r = ndlc_probe(phy, &i2c_phy_ops, &client->dev,
242*4882a593Smuzhiyun 			ST_NCI_FRAME_HEADROOM, ST_NCI_FRAME_TAILROOM,
243*4882a593Smuzhiyun 			&phy->ndlc, &phy->se_status);
244*4882a593Smuzhiyun 	if (r < 0) {
245*4882a593Smuzhiyun 		nfc_err(&client->dev, "Unable to register ndlc layer\n");
246*4882a593Smuzhiyun 		return r;
247*4882a593Smuzhiyun 	}
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	phy->irq_active = true;
250*4882a593Smuzhiyun 	r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
251*4882a593Smuzhiyun 				st_nci_irq_thread_fn,
252*4882a593Smuzhiyun 				IRQF_ONESHOT,
253*4882a593Smuzhiyun 				ST_NCI_DRIVER_NAME, phy);
254*4882a593Smuzhiyun 	if (r < 0)
255*4882a593Smuzhiyun 		nfc_err(&client->dev, "Unable to register IRQ handler\n");
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	return r;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
st_nci_i2c_remove(struct i2c_client * client)260*4882a593Smuzhiyun static int st_nci_i2c_remove(struct i2c_client *client)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	struct st_nci_i2c_phy *phy = i2c_get_clientdata(client);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	dev_dbg(&client->dev, "%s\n", __func__);
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	ndlc_remove(phy->ndlc);
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	return 0;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun static const struct i2c_device_id st_nci_i2c_id_table[] = {
272*4882a593Smuzhiyun 	{ST_NCI_DRIVER_NAME, 0},
273*4882a593Smuzhiyun 	{}
274*4882a593Smuzhiyun };
275*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, st_nci_i2c_id_table);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun static const struct acpi_device_id st_nci_i2c_acpi_match[] = {
278*4882a593Smuzhiyun 	{"SMO2101"},
279*4882a593Smuzhiyun 	{"SMO2102"},
280*4882a593Smuzhiyun 	{}
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun MODULE_DEVICE_TABLE(acpi, st_nci_i2c_acpi_match);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun static const struct of_device_id of_st_nci_i2c_match[] = {
285*4882a593Smuzhiyun 	{ .compatible = "st,st21nfcb-i2c", },
286*4882a593Smuzhiyun 	{ .compatible = "st,st21nfcb_i2c", },
287*4882a593Smuzhiyun 	{ .compatible = "st,st21nfcc-i2c", },
288*4882a593Smuzhiyun 	{}
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, of_st_nci_i2c_match);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static struct i2c_driver st_nci_i2c_driver = {
293*4882a593Smuzhiyun 	.driver = {
294*4882a593Smuzhiyun 		.name = ST_NCI_I2C_DRIVER_NAME,
295*4882a593Smuzhiyun 		.of_match_table = of_match_ptr(of_st_nci_i2c_match),
296*4882a593Smuzhiyun 		.acpi_match_table = ACPI_PTR(st_nci_i2c_acpi_match),
297*4882a593Smuzhiyun 	},
298*4882a593Smuzhiyun 	.probe = st_nci_i2c_probe,
299*4882a593Smuzhiyun 	.id_table = st_nci_i2c_id_table,
300*4882a593Smuzhiyun 	.remove = st_nci_i2c_remove,
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun module_i2c_driver(st_nci_i2c_driver);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun MODULE_LICENSE("GPL");
305*4882a593Smuzhiyun MODULE_DESCRIPTION(DRIVER_DESC);
306