2 * I2C link layer for the NXP NCI driver
4 * Copyright (C) 2014 NXP Semiconductors All rights reserved.
5 * Copyright (C) 2012-2015 Intel Corporation. All rights reserved.
7 * Authors: Clément Perrochaud <clement.perrochaud@nxp.com>
8 * Authors: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
10 * Derived from PN544 device driver:
11 * Copyright (C) 2012 Intel Corporation. All rights reserved.
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms and conditions of the GNU General Public License,
15 * version 2, as published by the Free Software Foundation.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <http://www.gnu.org/licenses/>.
26 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
28 #include <linux/acpi.h>
29 #include <linux/delay.h>
30 #include <linux/i2c.h>
31 #include <linux/interrupt.h>
32 #include <linux/module.h>
33 #include <linux/nfc.h>
34 #include <linux/gpio/consumer.h>
35 #include <linux/of_gpio.h>
36 #include <linux/of_irq.h>
37 #include <linux/platform_data/nxp-nci.h>
38 #include <asm/unaligned.h>
40 #include <net/nfc/nfc.h>
44 #define NXP_NCI_I2C_DRIVER_NAME "nxp-nci_i2c"
46 #define NXP_NCI_I2C_MAX_PAYLOAD 32
48 struct nxp_nci_i2c_phy
{
49 struct i2c_client
*i2c_dev
;
56 * < 0 if hardware error occurred (e.g. i2c err)
57 * and prevents normal operation.
61 static int nxp_nci_i2c_set_mode(void *phy_id
,
62 enum nxp_nci_mode mode
)
64 struct nxp_nci_i2c_phy
*phy
= (struct nxp_nci_i2c_phy
*) phy_id
;
66 gpio_set_value(phy
->gpio_fw
, (mode
== NXP_NCI_MODE_FW
) ? 1 : 0);
67 gpio_set_value(phy
->gpio_en
, (mode
!= NXP_NCI_MODE_COLD
) ? 1 : 0);
68 usleep_range(10000, 15000);
70 if (mode
== NXP_NCI_MODE_COLD
)
76 static int nxp_nci_i2c_write(void *phy_id
, struct sk_buff
*skb
)
79 struct nxp_nci_i2c_phy
*phy
= phy_id
;
80 struct i2c_client
*client
= phy
->i2c_dev
;
82 if (phy
->hard_fault
!= 0)
83 return phy
->hard_fault
;
85 r
= i2c_master_send(client
, skb
->data
, skb
->len
);
87 /* Retry, chip was in standby */
89 r
= i2c_master_send(client
, skb
->data
, skb
->len
);
93 nfc_err(&client
->dev
, "Error %d on I2C send\n", r
);
94 } else if (r
!= skb
->len
) {
96 "Invalid length sent: %u (expected %u)\n",
100 /* Success but return 0 and not number of bytes */
107 static const struct nxp_nci_phy_ops i2c_phy_ops
= {
108 .set_mode
= nxp_nci_i2c_set_mode
,
109 .write
= nxp_nci_i2c_write
,
112 static int nxp_nci_i2c_fw_read(struct nxp_nci_i2c_phy
*phy
,
113 struct sk_buff
**skb
)
115 struct i2c_client
*client
= phy
->i2c_dev
;
120 r
= i2c_master_recv(client
, (u8
*) &header
, NXP_NCI_FW_HDR_LEN
);
123 } else if (r
!= NXP_NCI_FW_HDR_LEN
) {
124 nfc_err(&client
->dev
, "Incorrect header length: %u\n", r
);
129 frame_len
= (be16_to_cpu(header
) & NXP_NCI_FW_FRAME_LEN_MASK
) +
132 *skb
= alloc_skb(NXP_NCI_FW_HDR_LEN
+ frame_len
, GFP_KERNEL
);
138 skb_put_data(*skb
, &header
, NXP_NCI_FW_HDR_LEN
);
140 r
= i2c_master_recv(client
, skb_put(*skb
, frame_len
), frame_len
);
141 if (r
!= frame_len
) {
142 nfc_err(&client
->dev
,
143 "Invalid frame length: %u (expected %zu)\n",
146 goto fw_read_exit_free_skb
;
151 fw_read_exit_free_skb
:
157 static int nxp_nci_i2c_nci_read(struct nxp_nci_i2c_phy
*phy
,
158 struct sk_buff
**skb
)
160 struct nci_ctrl_hdr header
; /* May actually be a data header */
161 struct i2c_client
*client
= phy
->i2c_dev
;
164 r
= i2c_master_recv(client
, (u8
*) &header
, NCI_CTRL_HDR_SIZE
);
167 } else if (r
!= NCI_CTRL_HDR_SIZE
) {
168 nfc_err(&client
->dev
, "Incorrect header length: %u\n", r
);
173 *skb
= alloc_skb(NCI_CTRL_HDR_SIZE
+ header
.plen
, GFP_KERNEL
);
179 skb_put_data(*skb
, (void *)&header
, NCI_CTRL_HDR_SIZE
);
181 r
= i2c_master_recv(client
, skb_put(*skb
, header
.plen
), header
.plen
);
182 if (r
!= header
.plen
) {
183 nfc_err(&client
->dev
,
184 "Invalid frame payload length: %u (expected %u)\n",
187 goto nci_read_exit_free_skb
;
192 nci_read_exit_free_skb
:
198 static irqreturn_t
nxp_nci_i2c_irq_thread_fn(int irq
, void *phy_id
)
200 struct nxp_nci_i2c_phy
*phy
= phy_id
;
201 struct i2c_client
*client
;
202 struct nxp_nci_info
*info
;
204 struct sk_buff
*skb
= NULL
;
207 if (!phy
|| !phy
->ndev
)
210 client
= phy
->i2c_dev
;
212 if (!client
|| irq
!= client
->irq
)
215 info
= nci_get_drvdata(phy
->ndev
);
220 mutex_lock(&info
->info_lock
);
222 if (phy
->hard_fault
!= 0)
223 goto exit_irq_handled
;
225 switch (info
->mode
) {
226 case NXP_NCI_MODE_NCI
:
227 r
= nxp_nci_i2c_nci_read(phy
, &skb
);
229 case NXP_NCI_MODE_FW
:
230 r
= nxp_nci_i2c_fw_read(phy
, &skb
);
232 case NXP_NCI_MODE_COLD
:
237 if (r
== -EREMOTEIO
) {
239 if (info
->mode
== NXP_NCI_MODE_FW
)
240 nxp_nci_fw_recv_frame(phy
->ndev
, NULL
);
243 nfc_err(&client
->dev
, "Read failed with error %d\n", r
);
244 goto exit_irq_handled
;
247 switch (info
->mode
) {
248 case NXP_NCI_MODE_NCI
:
249 nci_recv_frame(phy
->ndev
, skb
);
251 case NXP_NCI_MODE_FW
:
252 nxp_nci_fw_recv_frame(phy
->ndev
, skb
);
254 case NXP_NCI_MODE_COLD
:
259 mutex_unlock(&info
->info_lock
);
266 static int nxp_nci_i2c_parse_devtree(struct i2c_client
*client
)
268 struct nxp_nci_i2c_phy
*phy
= i2c_get_clientdata(client
);
269 struct device_node
*pp
;
272 pp
= client
->dev
.of_node
;
276 r
= of_get_named_gpio(pp
, "enable-gpios", 0);
277 if (r
== -EPROBE_DEFER
)
278 r
= of_get_named_gpio(pp
, "enable-gpios", 0);
280 nfc_err(&client
->dev
, "Failed to get EN gpio, error: %d\n", r
);
285 r
= of_get_named_gpio(pp
, "firmware-gpios", 0);
286 if (r
== -EPROBE_DEFER
)
287 r
= of_get_named_gpio(pp
, "firmware-gpios", 0);
289 nfc_err(&client
->dev
, "Failed to get FW gpio, error: %d\n", r
);
297 static int nxp_nci_i2c_acpi_config(struct nxp_nci_i2c_phy
*phy
)
299 struct i2c_client
*client
= phy
->i2c_dev
;
300 struct gpio_desc
*gpiod_en
, *gpiod_fw
;
302 gpiod_en
= devm_gpiod_get_index(&client
->dev
, NULL
, 2, GPIOD_OUT_LOW
);
303 gpiod_fw
= devm_gpiod_get_index(&client
->dev
, NULL
, 1, GPIOD_OUT_LOW
);
305 if (IS_ERR(gpiod_en
) || IS_ERR(gpiod_fw
)) {
306 nfc_err(&client
->dev
, "No GPIOs\n");
310 phy
->gpio_en
= desc_to_gpio(gpiod_en
);
311 phy
->gpio_fw
= desc_to_gpio(gpiod_fw
);
316 static int nxp_nci_i2c_probe(struct i2c_client
*client
,
317 const struct i2c_device_id
*id
)
319 struct nxp_nci_i2c_phy
*phy
;
320 struct nxp_nci_nfc_platform_data
*pdata
;
323 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
)) {
324 nfc_err(&client
->dev
, "Need I2C_FUNC_I2C\n");
329 phy
= devm_kzalloc(&client
->dev
, sizeof(struct nxp_nci_i2c_phy
),
336 phy
->i2c_dev
= client
;
337 i2c_set_clientdata(client
, phy
);
339 pdata
= client
->dev
.platform_data
;
341 if (!pdata
&& client
->dev
.of_node
) {
342 r
= nxp_nci_i2c_parse_devtree(client
);
344 nfc_err(&client
->dev
, "Failed to get DT data\n");
348 phy
->gpio_en
= pdata
->gpio_en
;
349 phy
->gpio_fw
= pdata
->gpio_fw
;
350 } else if (ACPI_HANDLE(&client
->dev
)) {
351 r
= nxp_nci_i2c_acpi_config(phy
);
356 nfc_err(&client
->dev
, "No platform data\n");
361 r
= devm_gpio_request_one(&phy
->i2c_dev
->dev
, phy
->gpio_en
,
362 GPIOF_OUT_INIT_LOW
, "nxp_nci_en");
366 r
= devm_gpio_request_one(&phy
->i2c_dev
->dev
, phy
->gpio_fw
,
367 GPIOF_OUT_INIT_LOW
, "nxp_nci_fw");
372 r
= nxp_nci_probe(phy
, &client
->dev
, &i2c_phy_ops
,
373 NXP_NCI_I2C_MAX_PAYLOAD
, &phy
->ndev
);
377 r
= request_threaded_irq(client
->irq
, NULL
,
378 nxp_nci_i2c_irq_thread_fn
,
379 IRQF_TRIGGER_RISING
| IRQF_ONESHOT
,
380 NXP_NCI_I2C_DRIVER_NAME
, phy
);
382 nfc_err(&client
->dev
, "Unable to register IRQ handler\n");
388 static int nxp_nci_i2c_remove(struct i2c_client
*client
)
390 struct nxp_nci_i2c_phy
*phy
= i2c_get_clientdata(client
);
392 nxp_nci_remove(phy
->ndev
);
393 free_irq(client
->irq
, phy
);
398 static const struct i2c_device_id nxp_nci_i2c_id_table
[] = {
402 MODULE_DEVICE_TABLE(i2c
, nxp_nci_i2c_id_table
);
404 static const struct of_device_id of_nxp_nci_i2c_match
[] = {
405 { .compatible
= "nxp,nxp-nci-i2c", },
408 MODULE_DEVICE_TABLE(of
, of_nxp_nci_i2c_match
);
411 static struct acpi_device_id acpi_id
[] = {
415 MODULE_DEVICE_TABLE(acpi
, acpi_id
);
418 static struct i2c_driver nxp_nci_i2c_driver
= {
420 .name
= NXP_NCI_I2C_DRIVER_NAME
,
421 .acpi_match_table
= ACPI_PTR(acpi_id
),
422 .of_match_table
= of_match_ptr(of_nxp_nci_i2c_match
),
424 .probe
= nxp_nci_i2c_probe
,
425 .id_table
= nxp_nci_i2c_id_table
,
426 .remove
= nxp_nci_i2c_remove
,
429 module_i2c_driver(nxp_nci_i2c_driver
);
431 MODULE_LICENSE("GPL");
432 MODULE_DESCRIPTION("I2C driver for NXP NCI NFC controllers");
433 MODULE_AUTHOR("Clément Perrochaud <clement.perrochaud@nxp.com>");
434 MODULE_AUTHOR("Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>");