i2c.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* -------------------------------------------------------------------------
  3. * Copyright (C) 2014-2016, Intel Corporation
  4. *
  5. * -------------------------------------------------------------------------
  6. */
  7. #include <linux/module.h>
  8. #include <linux/acpi.h>
  9. #include <linux/i2c.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/nfc.h>
  12. #include <linux/delay.h>
  13. #include <linux/gpio/consumer.h>
  14. #include <net/nfc/nfc.h>
  15. #include <net/nfc/nci_core.h>
  16. #include "fdp.h"
  17. #define FDP_I2C_DRIVER_NAME "fdp_nci_i2c"
  18. #define FDP_DP_CLOCK_TYPE_NAME "clock-type"
  19. #define FDP_DP_CLOCK_FREQ_NAME "clock-freq"
  20. #define FDP_DP_FW_VSC_CFG_NAME "fw-vsc-cfg"
  21. #define FDP_FRAME_HEADROOM 2
  22. #define FDP_FRAME_TAILROOM 1
  23. #define FDP_NCI_I2C_MIN_PAYLOAD 5
  24. #define FDP_NCI_I2C_MAX_PAYLOAD 261
  25. #define FDP_POWER_OFF 0
  26. #define FDP_POWER_ON 1
  27. #define fdp_nci_i2c_dump_skb(dev, prefix, skb) \
  28. print_hex_dump(KERN_DEBUG, prefix": ", DUMP_PREFIX_OFFSET, \
  29. 16, 1, (skb)->data, (skb)->len, 0)
  30. static void fdp_nci_i2c_reset(const struct fdp_i2c_phy *phy)
  31. {
  32. /* Reset RST/WakeUP for at least 100 micro-second */
  33. gpiod_set_value_cansleep(phy->power_gpio, FDP_POWER_OFF);
  34. usleep_range(1000, 4000);
  35. gpiod_set_value_cansleep(phy->power_gpio, FDP_POWER_ON);
  36. usleep_range(10000, 14000);
  37. }
  38. static int fdp_nci_i2c_enable(void *phy_id)
  39. {
  40. const struct fdp_i2c_phy *phy = phy_id;
  41. fdp_nci_i2c_reset(phy);
  42. return 0;
  43. }
  44. static void fdp_nci_i2c_disable(void *phy_id)
  45. {
  46. const struct fdp_i2c_phy *phy = phy_id;
  47. fdp_nci_i2c_reset(phy);
  48. }
  49. static void fdp_nci_i2c_add_len_lrc(struct sk_buff *skb)
  50. {
  51. u8 lrc = 0;
  52. u16 len, i;
  53. /* Add length header */
  54. len = skb->len;
  55. *(u8 *)skb_push(skb, 1) = len & 0xff;
  56. *(u8 *)skb_push(skb, 1) = len >> 8;
  57. /* Compute and add lrc */
  58. for (i = 0; i < len + 2; i++)
  59. lrc ^= skb->data[i];
  60. skb_put_u8(skb, lrc);
  61. }
  62. static void fdp_nci_i2c_remove_len_lrc(struct sk_buff *skb)
  63. {
  64. skb_pull(skb, FDP_FRAME_HEADROOM);
  65. skb_trim(skb, skb->len - FDP_FRAME_TAILROOM);
  66. }
  67. static int fdp_nci_i2c_write(void *phy_id, struct sk_buff *skb)
  68. {
  69. struct fdp_i2c_phy *phy = phy_id;
  70. struct i2c_client *client = phy->i2c_dev;
  71. int r;
  72. if (phy->hard_fault != 0)
  73. return phy->hard_fault;
  74. fdp_nci_i2c_add_len_lrc(skb);
  75. fdp_nci_i2c_dump_skb(&client->dev, "fdp_wr", skb);
  76. r = i2c_master_send(client, skb->data, skb->len);
  77. if (r == -EREMOTEIO) { /* Retry, chip was in standby */
  78. usleep_range(1000, 4000);
  79. r = i2c_master_send(client, skb->data, skb->len);
  80. }
  81. if (r < 0 || r != skb->len)
  82. dev_dbg(&client->dev, "%s: error err=%d len=%d\n",
  83. __func__, r, skb->len);
  84. if (r >= 0) {
  85. if (r != skb->len) {
  86. phy->hard_fault = r;
  87. r = -EREMOTEIO;
  88. } else {
  89. r = 0;
  90. }
  91. }
  92. fdp_nci_i2c_remove_len_lrc(skb);
  93. return r;
  94. }
  95. static const struct nfc_phy_ops i2c_phy_ops = {
  96. .write = fdp_nci_i2c_write,
  97. .enable = fdp_nci_i2c_enable,
  98. .disable = fdp_nci_i2c_disable,
  99. };
  100. static int fdp_nci_i2c_read(struct fdp_i2c_phy *phy, struct sk_buff **skb)
  101. {
  102. int r, len;
  103. u8 tmp[FDP_NCI_I2C_MAX_PAYLOAD], lrc, k;
  104. u16 i;
  105. struct i2c_client *client = phy->i2c_dev;
  106. *skb = NULL;
  107. /* Read the length packet and the data packet */
  108. for (k = 0; k < 2; k++) {
  109. len = phy->next_read_size;
  110. r = i2c_master_recv(client, tmp, len);
  111. if (r != len) {
  112. dev_dbg(&client->dev, "%s: i2c recv err: %d\n",
  113. __func__, r);
  114. goto flush;
  115. }
  116. /* Check packet integruty */
  117. for (lrc = i = 0; i < r; i++)
  118. lrc ^= tmp[i];
  119. /*
  120. * LRC check failed. This may due to transmission error or
  121. * desynchronization between driver and FDP. Drop the packet
  122. * and force resynchronization
  123. */
  124. if (lrc) {
  125. dev_dbg(&client->dev, "%s: corrupted packet\n",
  126. __func__);
  127. phy->next_read_size = 5;
  128. goto flush;
  129. }
  130. /* Packet that contains a length */
  131. if (tmp[0] == 0 && tmp[1] == 0) {
  132. phy->next_read_size = (tmp[2] << 8) + tmp[3] + 3;
  133. } else {
  134. phy->next_read_size = FDP_NCI_I2C_MIN_PAYLOAD;
  135. *skb = alloc_skb(len, GFP_KERNEL);
  136. if (*skb == NULL) {
  137. r = -ENOMEM;
  138. goto flush;
  139. }
  140. skb_put_data(*skb, tmp, len);
  141. fdp_nci_i2c_dump_skb(&client->dev, "fdp_rd", *skb);
  142. fdp_nci_i2c_remove_len_lrc(*skb);
  143. }
  144. }
  145. return 0;
  146. flush:
  147. /* Flush the remaining data */
  148. if (i2c_master_recv(client, tmp, sizeof(tmp)) < 0)
  149. r = -EREMOTEIO;
  150. return r;
  151. }
  152. static irqreturn_t fdp_nci_i2c_irq_thread_fn(int irq, void *phy_id)
  153. {
  154. struct fdp_i2c_phy *phy = phy_id;
  155. struct sk_buff *skb;
  156. int r;
  157. if (!phy || irq != phy->i2c_dev->irq) {
  158. WARN_ON_ONCE(1);
  159. return IRQ_NONE;
  160. }
  161. r = fdp_nci_i2c_read(phy, &skb);
  162. if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG)
  163. return IRQ_HANDLED;
  164. if (skb != NULL)
  165. nci_recv_frame(phy->ndev, skb);
  166. return IRQ_HANDLED;
  167. }
  168. static void fdp_nci_i2c_read_device_properties(struct device *dev,
  169. u8 *clock_type, u32 *clock_freq,
  170. u8 **fw_vsc_cfg)
  171. {
  172. int r;
  173. u8 len;
  174. r = device_property_read_u8(dev, FDP_DP_CLOCK_TYPE_NAME, clock_type);
  175. if (r) {
  176. dev_dbg(dev, "Using default clock type");
  177. *clock_type = 0;
  178. }
  179. r = device_property_read_u32(dev, FDP_DP_CLOCK_FREQ_NAME, clock_freq);
  180. if (r) {
  181. dev_dbg(dev, "Using default clock frequency\n");
  182. *clock_freq = 26000;
  183. }
  184. if (device_property_present(dev, FDP_DP_FW_VSC_CFG_NAME)) {
  185. r = device_property_read_u8(dev, FDP_DP_FW_VSC_CFG_NAME,
  186. &len);
  187. if (r || len <= 0)
  188. goto vsc_read_err;
  189. /* Add 1 to the length to inclue the length byte itself */
  190. len++;
  191. *fw_vsc_cfg = devm_kmalloc_array(dev,
  192. len, sizeof(**fw_vsc_cfg),
  193. GFP_KERNEL);
  194. if (!*fw_vsc_cfg)
  195. goto alloc_err;
  196. r = device_property_read_u8_array(dev, FDP_DP_FW_VSC_CFG_NAME,
  197. *fw_vsc_cfg, len);
  198. if (r) {
  199. devm_kfree(dev, *fw_vsc_cfg);
  200. goto vsc_read_err;
  201. }
  202. } else {
  203. vsc_read_err:
  204. dev_dbg(dev, "FW vendor specific commands not present\n");
  205. *fw_vsc_cfg = NULL;
  206. }
  207. alloc_err:
  208. dev_dbg(dev, "Clock type: %d, clock frequency: %d, VSC: %s",
  209. *clock_type, *clock_freq, *fw_vsc_cfg != NULL ? "yes" : "no");
  210. }
  211. static const struct acpi_gpio_params power_gpios = { 0, 0, false };
  212. static const struct acpi_gpio_mapping acpi_fdp_gpios[] = {
  213. { "power-gpios", &power_gpios, 1 },
  214. {},
  215. };
  216. static int fdp_nci_i2c_probe(struct i2c_client *client)
  217. {
  218. struct fdp_i2c_phy *phy;
  219. struct device *dev = &client->dev;
  220. u8 *fw_vsc_cfg;
  221. u8 clock_type;
  222. u32 clock_freq;
  223. int r = 0;
  224. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  225. nfc_err(dev, "No I2C_FUNC_I2C support\n");
  226. return -ENODEV;
  227. }
  228. /* Checking if we have an irq */
  229. if (client->irq <= 0) {
  230. nfc_err(dev, "IRQ not present\n");
  231. return -ENODEV;
  232. }
  233. phy = devm_kzalloc(dev, sizeof(struct fdp_i2c_phy), GFP_KERNEL);
  234. if (!phy)
  235. return -ENOMEM;
  236. phy->i2c_dev = client;
  237. phy->next_read_size = FDP_NCI_I2C_MIN_PAYLOAD;
  238. i2c_set_clientdata(client, phy);
  239. r = devm_request_threaded_irq(dev, client->irq,
  240. NULL, fdp_nci_i2c_irq_thread_fn,
  241. IRQF_TRIGGER_RISING | IRQF_ONESHOT,
  242. FDP_I2C_DRIVER_NAME, phy);
  243. if (r < 0) {
  244. nfc_err(&client->dev, "Unable to register IRQ handler\n");
  245. return r;
  246. }
  247. r = devm_acpi_dev_add_driver_gpios(dev, acpi_fdp_gpios);
  248. if (r)
  249. dev_dbg(dev, "Unable to add GPIO mapping table\n");
  250. /* Requesting the power gpio */
  251. phy->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
  252. if (IS_ERR(phy->power_gpio)) {
  253. nfc_err(dev, "Power GPIO request failed\n");
  254. return PTR_ERR(phy->power_gpio);
  255. }
  256. /* read device properties to get the clock and production settings */
  257. fdp_nci_i2c_read_device_properties(dev, &clock_type, &clock_freq,
  258. &fw_vsc_cfg);
  259. /* Call the NFC specific probe function */
  260. r = fdp_nci_probe(phy, &i2c_phy_ops, &phy->ndev,
  261. FDP_FRAME_HEADROOM, FDP_FRAME_TAILROOM,
  262. clock_type, clock_freq, fw_vsc_cfg);
  263. if (r < 0) {
  264. nfc_err(dev, "NCI probing error\n");
  265. return r;
  266. }
  267. return 0;
  268. }
  269. static void fdp_nci_i2c_remove(struct i2c_client *client)
  270. {
  271. struct fdp_i2c_phy *phy = i2c_get_clientdata(client);
  272. fdp_nci_remove(phy->ndev);
  273. fdp_nci_i2c_disable(phy);
  274. }
  275. static const struct acpi_device_id fdp_nci_i2c_acpi_match[] = {
  276. {"INT339A", 0},
  277. {}
  278. };
  279. MODULE_DEVICE_TABLE(acpi, fdp_nci_i2c_acpi_match);
  280. static struct i2c_driver fdp_nci_i2c_driver = {
  281. .driver = {
  282. .name = FDP_I2C_DRIVER_NAME,
  283. .acpi_match_table = fdp_nci_i2c_acpi_match,
  284. },
  285. .probe_new = fdp_nci_i2c_probe,
  286. .remove = fdp_nci_i2c_remove,
  287. };
  288. module_i2c_driver(fdp_nci_i2c_driver);
  289. MODULE_LICENSE("GPL");
  290. MODULE_DESCRIPTION("I2C driver for Intel Fields Peak NFC controller");
  291. MODULE_AUTHOR("Robert Dolca <[email protected]>");