i2c-tegra-bpmp.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * drivers/i2c/busses/i2c-tegra-bpmp.c
  4. *
  5. * Copyright (c) 2016 NVIDIA Corporation. All rights reserved.
  6. *
  7. * Author: Shardar Shariff Md <[email protected]>
  8. */
  9. #include <linux/err.h>
  10. #include <linux/i2c.h>
  11. #include <linux/init.h>
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/of_device.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/pm_runtime.h>
  17. #include <soc/tegra/bpmp-abi.h>
  18. #include <soc/tegra/bpmp.h>
  19. /*
  20. * Serialized I2C message header size is 6 bytes and includes address, flags
  21. * and length
  22. */
  23. #define SERIALI2C_HDR_SIZE 6
  24. struct tegra_bpmp_i2c {
  25. struct i2c_adapter adapter;
  26. struct device *dev;
  27. struct tegra_bpmp *bpmp;
  28. unsigned int bus;
  29. };
  30. /*
  31. * Linux flags are translated to BPMP defined I2C flags that are used in BPMP
  32. * firmware I2C driver to avoid any issues in future if Linux I2C flags are
  33. * changed.
  34. */
  35. static void tegra_bpmp_xlate_flags(u16 flags, u16 *out)
  36. {
  37. if (flags & I2C_M_TEN)
  38. *out |= SERIALI2C_TEN;
  39. if (flags & I2C_M_RD)
  40. *out |= SERIALI2C_RD;
  41. if (flags & I2C_M_STOP)
  42. *out |= SERIALI2C_STOP;
  43. if (flags & I2C_M_NOSTART)
  44. *out |= SERIALI2C_NOSTART;
  45. if (flags & I2C_M_REV_DIR_ADDR)
  46. *out |= SERIALI2C_REV_DIR_ADDR;
  47. if (flags & I2C_M_IGNORE_NAK)
  48. *out |= SERIALI2C_IGNORE_NAK;
  49. if (flags & I2C_M_NO_RD_ACK)
  50. *out |= SERIALI2C_NO_RD_ACK;
  51. if (flags & I2C_M_RECV_LEN)
  52. *out |= SERIALI2C_RECV_LEN;
  53. }
  54. /*
  55. * The serialized I2C format is simply the following:
  56. * [addr little-endian][flags little-endian][len little-endian][data if write]
  57. * [addr little-endian][flags little-endian][len little-endian][data if write]
  58. * ...
  59. *
  60. * The flags are translated from Linux kernel representation to seriali2c
  61. * representation. Any undefined flag being set causes an error.
  62. *
  63. * The data is there only for writes. Reads have the data transferred in the
  64. * other direction, and thus data is not present.
  65. *
  66. * See deserialize_i2c documentation for the data format in the other direction.
  67. */
  68. static void tegra_bpmp_serialize_i2c_msg(struct tegra_bpmp_i2c *i2c,
  69. struct mrq_i2c_request *request,
  70. struct i2c_msg *msgs,
  71. unsigned int num)
  72. {
  73. char *buf = request->xfer.data_buf;
  74. unsigned int i, j, pos = 0;
  75. for (i = 0; i < num; i++) {
  76. struct i2c_msg *msg = &msgs[i];
  77. u16 flags = 0;
  78. tegra_bpmp_xlate_flags(msg->flags, &flags);
  79. buf[pos++] = msg->addr & 0xff;
  80. buf[pos++] = (msg->addr & 0xff00) >> 8;
  81. buf[pos++] = flags & 0xff;
  82. buf[pos++] = (flags & 0xff00) >> 8;
  83. buf[pos++] = msg->len & 0xff;
  84. buf[pos++] = (msg->len & 0xff00) >> 8;
  85. if ((flags & SERIALI2C_RD) == 0) {
  86. for (j = 0; j < msg->len; j++)
  87. buf[pos++] = msg->buf[j];
  88. }
  89. }
  90. request->xfer.data_size = pos;
  91. }
  92. /*
  93. * The data in the BPMP -> CPU direction is composed of sequential blocks for
  94. * those messages that have I2C_M_RD. So, for example, if you have:
  95. *
  96. * - !I2C_M_RD, len == 5, data == a0 01 02 03 04
  97. * - !I2C_M_RD, len == 1, data == a0
  98. * - I2C_M_RD, len == 2, data == [uninitialized buffer 1]
  99. * - !I2C_M_RD, len == 1, data == a2
  100. * - I2C_M_RD, len == 2, data == [uninitialized buffer 2]
  101. *
  102. * ...then the data in the BPMP -> CPU direction would be 4 bytes total, and
  103. * would contain 2 bytes that will go to uninitialized buffer 1, and 2 bytes
  104. * that will go to uninitialized buffer 2.
  105. */
  106. static int tegra_bpmp_i2c_deserialize(struct tegra_bpmp_i2c *i2c,
  107. struct mrq_i2c_response *response,
  108. struct i2c_msg *msgs,
  109. unsigned int num)
  110. {
  111. size_t size = response->xfer.data_size, len = 0, pos = 0;
  112. char *buf = response->xfer.data_buf;
  113. unsigned int i;
  114. for (i = 0; i < num; i++)
  115. if (msgs[i].flags & I2C_M_RD)
  116. len += msgs[i].len;
  117. if (len != size)
  118. return -EINVAL;
  119. for (i = 0; i < num; i++) {
  120. if (msgs[i].flags & I2C_M_RD) {
  121. memcpy(msgs[i].buf, buf + pos, msgs[i].len);
  122. pos += msgs[i].len;
  123. }
  124. }
  125. return 0;
  126. }
  127. static int tegra_bpmp_i2c_msg_len_check(struct i2c_msg *msgs, unsigned int num)
  128. {
  129. size_t tx_len = 0, rx_len = 0;
  130. unsigned int i;
  131. for (i = 0; i < num; i++)
  132. if (!(msgs[i].flags & I2C_M_RD))
  133. tx_len += SERIALI2C_HDR_SIZE + msgs[i].len;
  134. if (tx_len > TEGRA_I2C_IPC_MAX_IN_BUF_SIZE)
  135. return -EINVAL;
  136. for (i = 0; i < num; i++)
  137. if ((msgs[i].flags & I2C_M_RD))
  138. rx_len += msgs[i].len;
  139. if (rx_len > TEGRA_I2C_IPC_MAX_OUT_BUF_SIZE)
  140. return -EINVAL;
  141. return 0;
  142. }
  143. static int tegra_bpmp_i2c_msg_xfer(struct tegra_bpmp_i2c *i2c,
  144. struct mrq_i2c_request *request,
  145. struct mrq_i2c_response *response,
  146. bool atomic)
  147. {
  148. struct tegra_bpmp_message msg;
  149. int err;
  150. request->cmd = CMD_I2C_XFER;
  151. request->xfer.bus_id = i2c->bus;
  152. memset(&msg, 0, sizeof(msg));
  153. msg.mrq = MRQ_I2C;
  154. msg.tx.data = request;
  155. msg.tx.size = sizeof(*request);
  156. msg.rx.data = response;
  157. msg.rx.size = sizeof(*response);
  158. if (atomic)
  159. err = tegra_bpmp_transfer_atomic(i2c->bpmp, &msg);
  160. else
  161. err = tegra_bpmp_transfer(i2c->bpmp, &msg);
  162. if (err < 0) {
  163. dev_err(i2c->dev, "failed to transfer message: %d\n", err);
  164. return err;
  165. }
  166. if (msg.rx.ret != 0) {
  167. if (msg.rx.ret == -BPMP_EAGAIN) {
  168. dev_dbg(i2c->dev, "arbitration lost\n");
  169. return -EAGAIN;
  170. }
  171. if (msg.rx.ret == -BPMP_ETIMEDOUT) {
  172. dev_dbg(i2c->dev, "timeout\n");
  173. return -ETIMEDOUT;
  174. }
  175. if (msg.rx.ret == -BPMP_ENXIO) {
  176. dev_dbg(i2c->dev, "NAK\n");
  177. return -ENXIO;
  178. }
  179. dev_err(i2c->dev, "transaction failed: %d\n", msg.rx.ret);
  180. return -EIO;
  181. }
  182. return 0;
  183. }
  184. static int tegra_bpmp_i2c_xfer_common(struct i2c_adapter *adapter,
  185. struct i2c_msg *msgs, int num,
  186. bool atomic)
  187. {
  188. struct tegra_bpmp_i2c *i2c = i2c_get_adapdata(adapter);
  189. struct mrq_i2c_response response;
  190. struct mrq_i2c_request request;
  191. int err;
  192. err = tegra_bpmp_i2c_msg_len_check(msgs, num);
  193. if (err < 0) {
  194. dev_err(i2c->dev, "unsupported message length\n");
  195. return err;
  196. }
  197. memset(&request, 0, sizeof(request));
  198. memset(&response, 0, sizeof(response));
  199. tegra_bpmp_serialize_i2c_msg(i2c, &request, msgs, num);
  200. err = tegra_bpmp_i2c_msg_xfer(i2c, &request, &response, atomic);
  201. if (err < 0) {
  202. dev_err(i2c->dev, "failed to transfer message: %d\n", err);
  203. return err;
  204. }
  205. err = tegra_bpmp_i2c_deserialize(i2c, &response, msgs, num);
  206. if (err < 0) {
  207. dev_err(i2c->dev, "failed to deserialize message: %d\n", err);
  208. return err;
  209. }
  210. return num;
  211. }
  212. static int tegra_bpmp_i2c_xfer(struct i2c_adapter *adapter,
  213. struct i2c_msg *msgs, int num)
  214. {
  215. return tegra_bpmp_i2c_xfer_common(adapter, msgs, num, false);
  216. }
  217. static int tegra_bpmp_i2c_xfer_atomic(struct i2c_adapter *adapter,
  218. struct i2c_msg *msgs, int num)
  219. {
  220. return tegra_bpmp_i2c_xfer_common(adapter, msgs, num, true);
  221. }
  222. static u32 tegra_bpmp_i2c_func(struct i2c_adapter *adapter)
  223. {
  224. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR |
  225. I2C_FUNC_PROTOCOL_MANGLING | I2C_FUNC_NOSTART;
  226. }
  227. static const struct i2c_algorithm tegra_bpmp_i2c_algo = {
  228. .master_xfer = tegra_bpmp_i2c_xfer,
  229. .master_xfer_atomic = tegra_bpmp_i2c_xfer_atomic,
  230. .functionality = tegra_bpmp_i2c_func,
  231. };
  232. static int tegra_bpmp_i2c_probe(struct platform_device *pdev)
  233. {
  234. struct tegra_bpmp_i2c *i2c;
  235. u32 value;
  236. int err;
  237. i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
  238. if (!i2c)
  239. return -ENOMEM;
  240. i2c->dev = &pdev->dev;
  241. i2c->bpmp = dev_get_drvdata(pdev->dev.parent);
  242. if (!i2c->bpmp)
  243. return -ENODEV;
  244. err = of_property_read_u32(pdev->dev.of_node, "nvidia,bpmp-bus-id",
  245. &value);
  246. if (err < 0)
  247. return err;
  248. i2c->bus = value;
  249. i2c_set_adapdata(&i2c->adapter, i2c);
  250. i2c->adapter.owner = THIS_MODULE;
  251. strscpy(i2c->adapter.name, "Tegra BPMP I2C adapter",
  252. sizeof(i2c->adapter.name));
  253. i2c->adapter.algo = &tegra_bpmp_i2c_algo;
  254. i2c->adapter.dev.parent = &pdev->dev;
  255. i2c->adapter.dev.of_node = pdev->dev.of_node;
  256. platform_set_drvdata(pdev, i2c);
  257. return i2c_add_adapter(&i2c->adapter);
  258. }
  259. static int tegra_bpmp_i2c_remove(struct platform_device *pdev)
  260. {
  261. struct tegra_bpmp_i2c *i2c = platform_get_drvdata(pdev);
  262. i2c_del_adapter(&i2c->adapter);
  263. return 0;
  264. }
  265. static const struct of_device_id tegra_bpmp_i2c_of_match[] = {
  266. { .compatible = "nvidia,tegra186-bpmp-i2c", },
  267. { }
  268. };
  269. MODULE_DEVICE_TABLE(of, tegra_bpmp_i2c_of_match);
  270. static struct platform_driver tegra_bpmp_i2c_driver = {
  271. .driver = {
  272. .name = "tegra-bpmp-i2c",
  273. .of_match_table = tegra_bpmp_i2c_of_match,
  274. },
  275. .probe = tegra_bpmp_i2c_probe,
  276. .remove = tegra_bpmp_i2c_remove,
  277. };
  278. module_platform_driver(tegra_bpmp_i2c_driver);
  279. MODULE_DESCRIPTION("NVIDIA Tegra BPMP I2C bus controller driver");
  280. MODULE_AUTHOR("Shardar Shariff Md <[email protected]>");
  281. MODULE_AUTHOR("Juha-Matti Tilli");
  282. MODULE_LICENSE("GPL v2");