i2c.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * I2C link layer for the NXP NCI driver
  4. *
  5. * Copyright (C) 2014 NXP Semiconductors All rights reserved.
  6. * Copyright (C) 2012-2015 Intel Corporation. All rights reserved.
  7. *
  8. * Authors: Clément Perrochaud <clement.perrochaud@nxp.com>
  9. * Authors: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
  10. *
  11. * Derived from PN544 device driver:
  12. * Copyright (C) 2012 Intel Corporation. All rights reserved.
  13. */
  14. #include <linux/acpi.h>
  15. #include <linux/delay.h>
  16. #include <linux/i2c.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/module.h>
  19. #include <linux/nfc.h>
  20. #include <linux/gpio/consumer.h>
  21. #include <asm/unaligned.h>
  22. #include <net/nfc/nfc.h>
  23. #include "nxp-nci.h"
  24. #define NXP_NCI_I2C_DRIVER_NAME "nxp-nci_i2c"
  25. #define NXP_NCI_I2C_MAX_PAYLOAD 32
  26. struct nxp_nci_i2c_phy {
  27. struct i2c_client *i2c_dev;
  28. struct nci_dev *ndev;
  29. struct gpio_desc *gpiod_en;
  30. struct gpio_desc *gpiod_fw;
  31. int hard_fault; /*
  32. * < 0 if hardware error occurred (e.g. i2c err)
  33. * and prevents normal operation.
  34. */
  35. };
  36. static int nxp_nci_i2c_set_mode(void *phy_id,
  37. enum nxp_nci_mode mode)
  38. {
  39. struct nxp_nci_i2c_phy *phy = (struct nxp_nci_i2c_phy *) phy_id;
  40. gpiod_set_value(phy->gpiod_fw, (mode == NXP_NCI_MODE_FW) ? 1 : 0);
  41. gpiod_set_value(phy->gpiod_en, (mode != NXP_NCI_MODE_COLD) ? 1 : 0);
  42. usleep_range(10000, 15000);
  43. if (mode == NXP_NCI_MODE_COLD)
  44. phy->hard_fault = 0;
  45. return 0;
  46. }
  47. static int nxp_nci_i2c_write(void *phy_id, struct sk_buff *skb)
  48. {
  49. int r;
  50. struct nxp_nci_i2c_phy *phy = phy_id;
  51. struct i2c_client *client = phy->i2c_dev;
  52. if (phy->hard_fault != 0)
  53. return phy->hard_fault;
  54. r = i2c_master_send(client, skb->data, skb->len);
  55. if (r < 0) {
  56. /* Retry, chip was in standby */
  57. msleep(110);
  58. r = i2c_master_send(client, skb->data, skb->len);
  59. }
  60. if (r < 0) {
  61. nfc_err(&client->dev, "Error %d on I2C send\n", r);
  62. } else if (r != skb->len) {
  63. nfc_err(&client->dev,
  64. "Invalid length sent: %u (expected %u)\n",
  65. r, skb->len);
  66. r = -EREMOTEIO;
  67. } else {
  68. /* Success but return 0 and not number of bytes */
  69. r = 0;
  70. }
  71. return r;
  72. }
  73. static const struct nxp_nci_phy_ops i2c_phy_ops = {
  74. .set_mode = nxp_nci_i2c_set_mode,
  75. .write = nxp_nci_i2c_write,
  76. };
  77. static int nxp_nci_i2c_fw_read(struct nxp_nci_i2c_phy *phy,
  78. struct sk_buff **skb)
  79. {
  80. struct i2c_client *client = phy->i2c_dev;
  81. u16 header;
  82. size_t frame_len;
  83. int r;
  84. r = i2c_master_recv(client, (u8 *) &header, NXP_NCI_FW_HDR_LEN);
  85. if (r < 0) {
  86. goto fw_read_exit;
  87. } else if (r != NXP_NCI_FW_HDR_LEN) {
  88. nfc_err(&client->dev, "Incorrect header length: %u\n", r);
  89. r = -EBADMSG;
  90. goto fw_read_exit;
  91. }
  92. frame_len = (be16_to_cpu(header) & NXP_NCI_FW_FRAME_LEN_MASK) +
  93. NXP_NCI_FW_CRC_LEN;
  94. *skb = alloc_skb(NXP_NCI_FW_HDR_LEN + frame_len, GFP_KERNEL);
  95. if (*skb == NULL) {
  96. r = -ENOMEM;
  97. goto fw_read_exit;
  98. }
  99. skb_put_data(*skb, &header, NXP_NCI_FW_HDR_LEN);
  100. r = i2c_master_recv(client, skb_put(*skb, frame_len), frame_len);
  101. if (r < 0) {
  102. goto fw_read_exit_free_skb;
  103. } else if (r != frame_len) {
  104. nfc_err(&client->dev,
  105. "Invalid frame length: %u (expected %zu)\n",
  106. r, frame_len);
  107. r = -EBADMSG;
  108. goto fw_read_exit_free_skb;
  109. }
  110. return 0;
  111. fw_read_exit_free_skb:
  112. kfree_skb(*skb);
  113. fw_read_exit:
  114. return r;
  115. }
  116. static int nxp_nci_i2c_nci_read(struct nxp_nci_i2c_phy *phy,
  117. struct sk_buff **skb)
  118. {
  119. struct nci_ctrl_hdr header; /* May actually be a data header */
  120. struct i2c_client *client = phy->i2c_dev;
  121. int r;
  122. r = i2c_master_recv(client, (u8 *) &header, NCI_CTRL_HDR_SIZE);
  123. if (r < 0) {
  124. goto nci_read_exit;
  125. } else if (r != NCI_CTRL_HDR_SIZE) {
  126. nfc_err(&client->dev, "Incorrect header length: %u\n", r);
  127. r = -EBADMSG;
  128. goto nci_read_exit;
  129. }
  130. *skb = alloc_skb(NCI_CTRL_HDR_SIZE + header.plen, GFP_KERNEL);
  131. if (*skb == NULL) {
  132. r = -ENOMEM;
  133. goto nci_read_exit;
  134. }
  135. skb_put_data(*skb, (void *)&header, NCI_CTRL_HDR_SIZE);
  136. if (!header.plen)
  137. return 0;
  138. r = i2c_master_recv(client, skb_put(*skb, header.plen), header.plen);
  139. if (r < 0) {
  140. goto nci_read_exit_free_skb;
  141. } else if (r != header.plen) {
  142. nfc_err(&client->dev,
  143. "Invalid frame payload length: %u (expected %u)\n",
  144. r, header.plen);
  145. r = -EBADMSG;
  146. goto nci_read_exit_free_skb;
  147. }
  148. return 0;
  149. nci_read_exit_free_skb:
  150. kfree_skb(*skb);
  151. nci_read_exit:
  152. return r;
  153. }
  154. static irqreturn_t nxp_nci_i2c_irq_thread_fn(int irq, void *phy_id)
  155. {
  156. struct nxp_nci_i2c_phy *phy = phy_id;
  157. struct i2c_client *client;
  158. struct nxp_nci_info *info;
  159. struct sk_buff *skb = NULL;
  160. int r = 0;
  161. if (!phy || !phy->ndev)
  162. goto exit_irq_none;
  163. client = phy->i2c_dev;
  164. if (!client || irq != client->irq)
  165. goto exit_irq_none;
  166. info = nci_get_drvdata(phy->ndev);
  167. if (!info)
  168. goto exit_irq_none;
  169. mutex_lock(&info->info_lock);
  170. if (phy->hard_fault != 0)
  171. goto exit_irq_handled;
  172. switch (info->mode) {
  173. case NXP_NCI_MODE_NCI:
  174. r = nxp_nci_i2c_nci_read(phy, &skb);
  175. break;
  176. case NXP_NCI_MODE_FW:
  177. r = nxp_nci_i2c_fw_read(phy, &skb);
  178. break;
  179. case NXP_NCI_MODE_COLD:
  180. r = -EREMOTEIO;
  181. break;
  182. }
  183. if (r == -EREMOTEIO) {
  184. phy->hard_fault = r;
  185. if (info->mode == NXP_NCI_MODE_FW)
  186. nxp_nci_fw_recv_frame(phy->ndev, NULL);
  187. }
  188. if (r < 0) {
  189. nfc_err(&client->dev, "Read failed with error %d\n", r);
  190. goto exit_irq_handled;
  191. }
  192. switch (info->mode) {
  193. case NXP_NCI_MODE_NCI:
  194. nci_recv_frame(phy->ndev, skb);
  195. break;
  196. case NXP_NCI_MODE_FW:
  197. nxp_nci_fw_recv_frame(phy->ndev, skb);
  198. break;
  199. case NXP_NCI_MODE_COLD:
  200. break;
  201. }
  202. exit_irq_handled:
  203. mutex_unlock(&info->info_lock);
  204. return IRQ_HANDLED;
  205. exit_irq_none:
  206. WARN_ON_ONCE(1);
  207. return IRQ_NONE;
  208. }
  209. static const struct acpi_gpio_params firmware_gpios = { 1, 0, false };
  210. static const struct acpi_gpio_params enable_gpios = { 2, 0, false };
  211. static const struct acpi_gpio_mapping acpi_nxp_nci_gpios[] = {
  212. { "enable-gpios", &enable_gpios, 1 },
  213. { "firmware-gpios", &firmware_gpios, 1 },
  214. { }
  215. };
  216. static int nxp_nci_i2c_probe(struct i2c_client *client,
  217. const struct i2c_device_id *id)
  218. {
  219. struct device *dev = &client->dev;
  220. struct nxp_nci_i2c_phy *phy;
  221. int r;
  222. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  223. nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
  224. return -ENODEV;
  225. }
  226. phy = devm_kzalloc(&client->dev, sizeof(struct nxp_nci_i2c_phy),
  227. GFP_KERNEL);
  228. if (!phy)
  229. return -ENOMEM;
  230. phy->i2c_dev = client;
  231. i2c_set_clientdata(client, phy);
  232. r = devm_acpi_dev_add_driver_gpios(dev, acpi_nxp_nci_gpios);
  233. if (r)
  234. dev_dbg(dev, "Unable to add GPIO mapping table\n");
  235. phy->gpiod_en = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
  236. if (IS_ERR(phy->gpiod_en)) {
  237. nfc_err(dev, "Failed to get EN gpio\n");
  238. return PTR_ERR(phy->gpiod_en);
  239. }
  240. phy->gpiod_fw = devm_gpiod_get_optional(dev, "firmware", GPIOD_OUT_LOW);
  241. if (IS_ERR(phy->gpiod_fw)) {
  242. nfc_err(dev, "Failed to get FW gpio\n");
  243. return PTR_ERR(phy->gpiod_fw);
  244. }
  245. r = nxp_nci_probe(phy, &client->dev, &i2c_phy_ops,
  246. NXP_NCI_I2C_MAX_PAYLOAD, &phy->ndev);
  247. if (r < 0)
  248. return r;
  249. r = request_threaded_irq(client->irq, NULL,
  250. nxp_nci_i2c_irq_thread_fn,
  251. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  252. NXP_NCI_I2C_DRIVER_NAME, phy);
  253. if (r < 0)
  254. nfc_err(&client->dev, "Unable to register IRQ handler\n");
  255. return r;
  256. }
  257. static void nxp_nci_i2c_remove(struct i2c_client *client)
  258. {
  259. struct nxp_nci_i2c_phy *phy = i2c_get_clientdata(client);
  260. nxp_nci_remove(phy->ndev);
  261. free_irq(client->irq, phy);
  262. }
  263. static const struct i2c_device_id nxp_nci_i2c_id_table[] = {
  264. {"nxp-nci_i2c", 0},
  265. {}
  266. };
  267. MODULE_DEVICE_TABLE(i2c, nxp_nci_i2c_id_table);
  268. static const struct of_device_id of_nxp_nci_i2c_match[] = {
  269. { .compatible = "nxp,nxp-nci-i2c", },
  270. {}
  271. };
  272. MODULE_DEVICE_TABLE(of, of_nxp_nci_i2c_match);
  273. #ifdef CONFIG_ACPI
  274. static const struct acpi_device_id acpi_id[] = {
  275. { "NXP1001" },
  276. { "NXP7471" },
  277. { }
  278. };
  279. MODULE_DEVICE_TABLE(acpi, acpi_id);
  280. #endif
  281. static struct i2c_driver nxp_nci_i2c_driver = {
  282. .driver = {
  283. .name = NXP_NCI_I2C_DRIVER_NAME,
  284. .acpi_match_table = ACPI_PTR(acpi_id),
  285. .of_match_table = of_nxp_nci_i2c_match,
  286. },
  287. .probe = nxp_nci_i2c_probe,
  288. .id_table = nxp_nci_i2c_id_table,
  289. .remove = nxp_nci_i2c_remove,
  290. };
  291. module_i2c_driver(nxp_nci_i2c_driver);
  292. MODULE_LICENSE("GPL");
  293. MODULE_DESCRIPTION("I2C driver for NXP NCI NFC controllers");
  294. MODULE_AUTHOR("Clément Perrochaud <clement.perrochaud@nxp.com>");
  295. MODULE_AUTHOR("Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>");