Lines Matching +full:nfc +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* -------------------------------------------------------------------------
3 * Copyright (C) 2014-2016, Intel Corporation
5 * -------------------------------------------------------------------------
10 #include <linux/i2c.h>
12 #include <linux/nfc.h>
15 #include <net/nfc/nfc.h>
16 #include <net/nfc/nci_core.h>
22 #define FDP_DP_CLOCK_TYPE_NAME "clock-type"
23 #define FDP_DP_CLOCK_FREQ_NAME "clock-freq"
24 #define FDP_DP_FW_VSC_CFG_NAME "fw-vsc-cfg"
37 16, 1, (skb)->data, (skb)->len, 0)
41 /* Reset RST/WakeUP for at least 100 micro-second */ in fdp_nci_i2c_reset()
42 gpiod_set_value_cansleep(phy->power_gpio, FDP_POWER_OFF); in fdp_nci_i2c_reset()
44 gpiod_set_value_cansleep(phy->power_gpio, FDP_POWER_ON); in fdp_nci_i2c_reset()
70 len = skb->len; in fdp_nci_i2c_add_len_lrc()
76 lrc ^= skb->data[i]; in fdp_nci_i2c_add_len_lrc()
84 skb_trim(skb, skb->len - FDP_FRAME_TAILROOM); in fdp_nci_i2c_remove_len_lrc()
90 struct i2c_client *client = phy->i2c_dev; in fdp_nci_i2c_write()
93 if (phy->hard_fault != 0) in fdp_nci_i2c_write()
94 return phy->hard_fault; in fdp_nci_i2c_write()
97 fdp_nci_i2c_dump_skb(&client->dev, "fdp_wr", skb); in fdp_nci_i2c_write()
99 r = i2c_master_send(client, skb->data, skb->len); in fdp_nci_i2c_write()
100 if (r == -EREMOTEIO) { /* Retry, chip was in standby */ in fdp_nci_i2c_write()
102 r = i2c_master_send(client, skb->data, skb->len); in fdp_nci_i2c_write()
105 if (r < 0 || r != skb->len) in fdp_nci_i2c_write()
106 dev_dbg(&client->dev, "%s: error err=%d len=%d\n", in fdp_nci_i2c_write()
107 __func__, r, skb->len); in fdp_nci_i2c_write()
110 if (r != skb->len) { in fdp_nci_i2c_write()
111 phy->hard_fault = r; in fdp_nci_i2c_write()
112 r = -EREMOTEIO; in fdp_nci_i2c_write()
134 struct i2c_client *client = phy->i2c_dev; in fdp_nci_i2c_read()
141 len = phy->next_read_size; in fdp_nci_i2c_read()
145 dev_dbg(&client->dev, "%s: i2c recv err: %d\n", in fdp_nci_i2c_read()
160 dev_dbg(&client->dev, "%s: corrupted packet\n", in fdp_nci_i2c_read()
162 phy->next_read_size = 5; in fdp_nci_i2c_read()
168 phy->next_read_size = (tmp[2] << 8) + tmp[3] + 3; in fdp_nci_i2c_read()
170 phy->next_read_size = FDP_NCI_I2C_MIN_PAYLOAD; in fdp_nci_i2c_read()
174 r = -ENOMEM; in fdp_nci_i2c_read()
179 fdp_nci_i2c_dump_skb(&client->dev, "fdp_rd", *skb); in fdp_nci_i2c_read()
190 r = -EREMOTEIO; in fdp_nci_i2c_read()
201 if (!phy || irq != phy->i2c_dev->irq) { in fdp_nci_i2c_irq_thread_fn()
208 if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG) in fdp_nci_i2c_irq_thread_fn()
212 nci_recv_frame(phy->ndev, skb); in fdp_nci_i2c_irq_thread_fn()
274 { "power-gpios", &power_gpios, 1 },
281 struct device *dev = &client->dev; in fdp_nci_i2c_probe()
287 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in fdp_nci_i2c_probe()
289 return -ENODEV; in fdp_nci_i2c_probe()
293 if (client->irq <= 0) { in fdp_nci_i2c_probe()
295 return -ENODEV; in fdp_nci_i2c_probe()
300 return -ENOMEM; in fdp_nci_i2c_probe()
302 phy->i2c_dev = client; in fdp_nci_i2c_probe()
303 phy->next_read_size = FDP_NCI_I2C_MIN_PAYLOAD; in fdp_nci_i2c_probe()
306 r = devm_request_threaded_irq(dev, client->irq, in fdp_nci_i2c_probe()
312 nfc_err(&client->dev, "Unable to register IRQ handler\n"); in fdp_nci_i2c_probe()
321 phy->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in fdp_nci_i2c_probe()
322 if (IS_ERR(phy->power_gpio)) { in fdp_nci_i2c_probe()
324 return PTR_ERR(phy->power_gpio); in fdp_nci_i2c_probe()
331 /* Call the NFC specific probe function */ in fdp_nci_i2c_probe()
332 r = fdp_nci_probe(phy, &i2c_phy_ops, &phy->ndev, in fdp_nci_i2c_probe()
347 fdp_nci_remove(phy->ndev); in fdp_nci_i2c_remove()
368 MODULE_DESCRIPTION("I2C driver for Intel Fields Peak NFC controller");