Lines Matching +full:phy +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0-only
3 * HCI based Driver for Inside Secure microread NFC Chip - i2c layer
11 #include <linux/i2c.h>
43 * < 0 if hardware error occured (e.g. i2c err)
51 print_hex_dump(KERN_DEBUG, "i2c: ", DUMP_PREFIX_OFFSET, \
52 16, 1, (skb)->data, (skb)->len, 0); \
61 len = skb->len; in microread_i2c_add_len_crc()
64 for (i = 0; i < skb->len; i++) in microread_i2c_add_len_crc()
65 crc = crc ^ skb->data[i]; in microread_i2c_add_len_crc()
81 for (i = 0; i < skb->len - 1; i++) in check_crc()
82 crc = crc ^ skb->data[i]; in check_crc()
84 if (crc != skb->data[skb->len-1]) { in check_crc()
85 pr_err("CRC error 0x%x != 0x%x\n", crc, skb->data[skb->len-1]); in check_crc()
87 return -EPERM; in check_crc()
106 struct microread_i2c_phy *phy = phy_id; in microread_i2c_write() local
107 struct i2c_client *client = phy->i2c_dev; in microread_i2c_write()
109 if (phy->hard_fault != 0) in microread_i2c_write()
110 return phy->hard_fault; in microread_i2c_write()
116 I2C_DUMP_SKB("i2c frame written", skb); in microread_i2c_write()
118 r = i2c_master_send(client, skb->data, skb->len); in microread_i2c_write()
120 if (r == -EREMOTEIO) { /* Retry, chip was in standby */ in microread_i2c_write()
122 r = i2c_master_send(client, skb->data, skb->len); in microread_i2c_write()
126 if (r != skb->len) in microread_i2c_write()
127 r = -EREMOTEIO; in microread_i2c_write()
138 static int microread_i2c_read(struct microread_i2c_phy *phy, in microread_i2c_read() argument
143 u8 tmp[MICROREAD_I2C_LLC_MAX_SIZE - 1]; in microread_i2c_read()
144 struct i2c_client *client = phy->i2c_dev; in microread_i2c_read()
148 nfc_err(&client->dev, "cannot read len byte\n"); in microread_i2c_read()
149 return -EREMOTEIO; in microread_i2c_read()
154 nfc_err(&client->dev, "invalid len byte\n"); in microread_i2c_read()
155 r = -EBADMSG; in microread_i2c_read()
161 r = -ENOMEM; in microread_i2c_read()
170 return -EREMOTEIO; in microread_i2c_read()
178 r = -EBADMSG; in microread_i2c_read()
183 skb_trim(*skb, (*skb)->len - MICROREAD_I2C_FRAME_TAILROOM); in microread_i2c_read()
191 r = -EREMOTEIO; in microread_i2c_read()
200 struct microread_i2c_phy *phy = phy_id; in microread_i2c_irq_thread_fn() local
204 if (!phy || irq != phy->i2c_dev->irq) { in microread_i2c_irq_thread_fn()
209 if (phy->hard_fault != 0) in microread_i2c_irq_thread_fn()
212 r = microread_i2c_read(phy, &skb); in microread_i2c_irq_thread_fn()
213 if (r == -EREMOTEIO) { in microread_i2c_irq_thread_fn()
214 phy->hard_fault = r; in microread_i2c_irq_thread_fn()
216 nfc_hci_recv_frame(phy->hdev, NULL); in microread_i2c_irq_thread_fn()
219 } else if ((r == -ENOMEM) || (r == -EBADMSG)) { in microread_i2c_irq_thread_fn()
223 nfc_hci_recv_frame(phy->hdev, skb); in microread_i2c_irq_thread_fn()
236 struct microread_i2c_phy *phy; in microread_i2c_probe() local
239 phy = devm_kzalloc(&client->dev, sizeof(struct microread_i2c_phy), in microread_i2c_probe()
241 if (!phy) in microread_i2c_probe()
242 return -ENOMEM; in microread_i2c_probe()
244 i2c_set_clientdata(client, phy); in microread_i2c_probe()
245 phy->i2c_dev = client; in microread_i2c_probe()
247 r = request_threaded_irq(client->irq, NULL, microread_i2c_irq_thread_fn, in microread_i2c_probe()
249 MICROREAD_I2C_DRIVER_NAME, phy); in microread_i2c_probe()
251 nfc_err(&client->dev, "Unable to register IRQ handler\n"); in microread_i2c_probe()
255 r = microread_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME, in microread_i2c_probe()
258 MICROREAD_I2C_LLC_MAX_PAYLOAD, &phy->hdev); in microread_i2c_probe()
265 free_irq(client->irq, phy); in microread_i2c_probe()
272 struct microread_i2c_phy *phy = i2c_get_clientdata(client); in microread_i2c_remove() local
274 microread_remove(phy->hdev); in microread_i2c_remove()
276 free_irq(client->irq, phy); in microread_i2c_remove()
283 MODULE_DEVICE_TABLE(i2c, microread_i2c_id);