spi-mem.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2018 Exceet Electronics GmbH
  4. * Copyright (C) 2018 Bootlin
  5. *
  6. * Author: Boris Brezillon <boris.brezillon@bootlin.com>
  7. */
  8. #ifndef __UBOOT__
  9. #include <log.h>
  10. #include <dm/devres.h>
  11. #include <linux/dmaengine.h>
  12. #include <linux/pm_runtime.h>
  13. #include "internals.h"
  14. #else
  15. #include <common.h>
  16. #include <dm.h>
  17. #include <errno.h>
  18. #include <malloc.h>
  19. #include <spi.h>
  20. #include <spi.h>
  21. #include <spi-mem.h>
  22. #include <dm/device_compat.h>
  23. #include <dm/devres.h>
  24. #include <linux/bug.h>
  25. #endif
  26. #ifndef __UBOOT__
  27. /**
  28. * spi_controller_dma_map_mem_op_data() - DMA-map the buffer attached to a
  29. * memory operation
  30. * @ctlr: the SPI controller requesting this dma_map()
  31. * @op: the memory operation containing the buffer to map
  32. * @sgt: a pointer to a non-initialized sg_table that will be filled by this
  33. * function
  34. *
  35. * Some controllers might want to do DMA on the data buffer embedded in @op.
  36. * This helper prepares everything for you and provides a ready-to-use
  37. * sg_table. This function is not intended to be called from spi drivers.
  38. * Only SPI controller drivers should use it.
  39. * Note that the caller must ensure the memory region pointed by
  40. * op->data.buf.{in,out} is DMA-able before calling this function.
  41. *
  42. * Return: 0 in case of success, a negative error code otherwise.
  43. */
  44. int spi_controller_dma_map_mem_op_data(struct spi_controller *ctlr,
  45. const struct spi_mem_op *op,
  46. struct sg_table *sgt)
  47. {
  48. struct device *dmadev;
  49. if (!op->data.nbytes)
  50. return -EINVAL;
  51. if (op->data.dir == SPI_MEM_DATA_OUT && ctlr->dma_tx)
  52. dmadev = ctlr->dma_tx->device->dev;
  53. else if (op->data.dir == SPI_MEM_DATA_IN && ctlr->dma_rx)
  54. dmadev = ctlr->dma_rx->device->dev;
  55. else
  56. dmadev = ctlr->dev.parent;
  57. if (!dmadev)
  58. return -EINVAL;
  59. return spi_map_buf(ctlr, dmadev, sgt, op->data.buf.in, op->data.nbytes,
  60. op->data.dir == SPI_MEM_DATA_IN ?
  61. DMA_FROM_DEVICE : DMA_TO_DEVICE);
  62. }
  63. EXPORT_SYMBOL_GPL(spi_controller_dma_map_mem_op_data);
  64. /**
  65. * spi_controller_dma_unmap_mem_op_data() - DMA-unmap the buffer attached to a
  66. * memory operation
  67. * @ctlr: the SPI controller requesting this dma_unmap()
  68. * @op: the memory operation containing the buffer to unmap
  69. * @sgt: a pointer to an sg_table previously initialized by
  70. * spi_controller_dma_map_mem_op_data()
  71. *
  72. * Some controllers might want to do DMA on the data buffer embedded in @op.
  73. * This helper prepares things so that the CPU can access the
  74. * op->data.buf.{in,out} buffer again.
  75. *
  76. * This function is not intended to be called from SPI drivers. Only SPI
  77. * controller drivers should use it.
  78. *
  79. * This function should be called after the DMA operation has finished and is
  80. * only valid if the previous spi_controller_dma_map_mem_op_data() call
  81. * returned 0.
  82. *
  83. * Return: 0 in case of success, a negative error code otherwise.
  84. */
  85. void spi_controller_dma_unmap_mem_op_data(struct spi_controller *ctlr,
  86. const struct spi_mem_op *op,
  87. struct sg_table *sgt)
  88. {
  89. struct device *dmadev;
  90. if (!op->data.nbytes)
  91. return;
  92. if (op->data.dir == SPI_MEM_DATA_OUT && ctlr->dma_tx)
  93. dmadev = ctlr->dma_tx->device->dev;
  94. else if (op->data.dir == SPI_MEM_DATA_IN && ctlr->dma_rx)
  95. dmadev = ctlr->dma_rx->device->dev;
  96. else
  97. dmadev = ctlr->dev.parent;
  98. spi_unmap_buf(ctlr, dmadev, sgt,
  99. op->data.dir == SPI_MEM_DATA_IN ?
  100. DMA_FROM_DEVICE : DMA_TO_DEVICE);
  101. }
  102. EXPORT_SYMBOL_GPL(spi_controller_dma_unmap_mem_op_data);
  103. #endif /* __UBOOT__ */
  104. static int spi_check_buswidth_req(struct spi_slave *slave, u8 buswidth, bool tx)
  105. {
  106. u32 mode = slave->mode;
  107. switch (buswidth) {
  108. case 1:
  109. return 0;
  110. case 2:
  111. if ((tx && (mode & (SPI_TX_DUAL | SPI_TX_QUAD))) ||
  112. (!tx && (mode & (SPI_RX_DUAL | SPI_RX_QUAD))))
  113. return 0;
  114. break;
  115. case 4:
  116. if ((tx && (mode & SPI_TX_QUAD)) ||
  117. (!tx && (mode & SPI_RX_QUAD)))
  118. return 0;
  119. break;
  120. case 8:
  121. if ((tx && (mode & SPI_TX_OCTAL)) ||
  122. (!tx && (mode & SPI_RX_OCTAL)))
  123. return 0;
  124. break;
  125. default:
  126. break;
  127. }
  128. return -ENOTSUPP;
  129. }
  130. static bool spi_mem_check_buswidth(struct spi_slave *slave,
  131. const struct spi_mem_op *op)
  132. {
  133. if (spi_check_buswidth_req(slave, op->cmd.buswidth, true))
  134. return false;
  135. if (op->addr.nbytes &&
  136. spi_check_buswidth_req(slave, op->addr.buswidth, true))
  137. return false;
  138. if (op->dummy.nbytes &&
  139. spi_check_buswidth_req(slave, op->dummy.buswidth, true))
  140. return false;
  141. if (op->data.dir != SPI_MEM_NO_DATA &&
  142. spi_check_buswidth_req(slave, op->data.buswidth,
  143. op->data.dir == SPI_MEM_DATA_OUT))
  144. return false;
  145. return true;
  146. }
  147. bool spi_mem_dtr_supports_op(struct spi_slave *slave,
  148. const struct spi_mem_op *op)
  149. {
  150. if (op->cmd.buswidth == 8 && op->cmd.nbytes % 2)
  151. return false;
  152. if (op->addr.nbytes && op->addr.buswidth == 8 && op->addr.nbytes % 2)
  153. return false;
  154. if (op->dummy.nbytes && op->dummy.buswidth == 8 && op->dummy.nbytes % 2)
  155. return false;
  156. /*
  157. * Transactions of odd length do not make sense for 8D-8D-8D mode
  158. * because a byte is transferred in just half a cycle.
  159. */
  160. if (op->data.dir != SPI_MEM_NO_DATA && op->data.dir != SPI_MEM_DATA_IN &&
  161. op->data.buswidth == 8 && op->data.nbytes % 2)
  162. return false;
  163. return spi_mem_check_buswidth(slave, op);
  164. }
  165. EXPORT_SYMBOL_GPL(spi_mem_dtr_supports_op);
  166. bool spi_mem_default_supports_op(struct spi_slave *slave,
  167. const struct spi_mem_op *op)
  168. {
  169. if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
  170. return false;
  171. if (op->cmd.nbytes != 1)
  172. return false;
  173. return spi_mem_check_buswidth(slave, op);
  174. }
  175. EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);
  176. /**
  177. * spi_mem_supports_op() - Check if a memory device and the controller it is
  178. * connected to support a specific memory operation
  179. * @slave: the SPI device
  180. * @op: the memory operation to check
  181. *
  182. * Some controllers are only supporting Single or Dual IOs, others might only
  183. * support specific opcodes, or it can even be that the controller and device
  184. * both support Quad IOs but the hardware prevents you from using it because
  185. * only 2 IO lines are connected.
  186. *
  187. * This function checks whether a specific operation is supported.
  188. *
  189. * Return: true if @op is supported, false otherwise.
  190. */
  191. bool spi_mem_supports_op(struct spi_slave *slave,
  192. const struct spi_mem_op *op)
  193. {
  194. struct udevice *bus = slave->dev->parent;
  195. struct dm_spi_ops *ops = spi_get_ops(bus);
  196. if (ops->mem_ops && ops->mem_ops->supports_op)
  197. return ops->mem_ops->supports_op(slave, op);
  198. return spi_mem_default_supports_op(slave, op);
  199. }
  200. EXPORT_SYMBOL_GPL(spi_mem_supports_op);
  201. /**
  202. * spi_mem_exec_op() - Execute a memory operation
  203. * @slave: the SPI device
  204. * @op: the memory operation to execute
  205. *
  206. * Executes a memory operation.
  207. *
  208. * This function first checks that @op is supported and then tries to execute
  209. * it.
  210. *
  211. * Return: 0 in case of success, a negative error code otherwise.
  212. */
  213. int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)
  214. {
  215. struct udevice *bus = slave->dev->parent;
  216. struct dm_spi_ops *ops = spi_get_ops(bus);
  217. unsigned int pos = 0;
  218. const u8 *tx_buf = NULL;
  219. u8 *rx_buf = NULL;
  220. int op_len;
  221. u32 flag;
  222. int ret;
  223. int i;
  224. if (!spi_mem_supports_op(slave, op))
  225. return -ENOTSUPP;
  226. ret = spi_claim_bus(slave);
  227. if (ret < 0)
  228. return ret;
  229. if (ops->mem_ops && ops->mem_ops->exec_op) {
  230. #ifndef __UBOOT__
  231. /*
  232. * Flush the message queue before executing our SPI memory
  233. * operation to prevent preemption of regular SPI transfers.
  234. */
  235. spi_flush_queue(ctlr);
  236. if (ctlr->auto_runtime_pm) {
  237. ret = pm_runtime_get_sync(ctlr->dev.parent);
  238. if (ret < 0) {
  239. dev_err(&ctlr->dev,
  240. "Failed to power device: %d\n",
  241. ret);
  242. return ret;
  243. }
  244. }
  245. mutex_lock(&ctlr->bus_lock_mutex);
  246. mutex_lock(&ctlr->io_mutex);
  247. #endif
  248. ret = ops->mem_ops->exec_op(slave, op);
  249. #ifndef __UBOOT__
  250. mutex_unlock(&ctlr->io_mutex);
  251. mutex_unlock(&ctlr->bus_lock_mutex);
  252. if (ctlr->auto_runtime_pm)
  253. pm_runtime_put(ctlr->dev.parent);
  254. #endif
  255. /*
  256. * Some controllers only optimize specific paths (typically the
  257. * read path) and expect the core to use the regular SPI
  258. * interface in other cases.
  259. */
  260. if (!ret || ret != -ENOTSUPP) {
  261. spi_release_bus(slave);
  262. return ret;
  263. }
  264. }
  265. #ifndef __UBOOT__
  266. tmpbufsize = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
  267. /*
  268. * Allocate a buffer to transmit the CMD, ADDR cycles with kmalloc() so
  269. * we're guaranteed that this buffer is DMA-able, as required by the
  270. * SPI layer.
  271. */
  272. tmpbuf = kzalloc(tmpbufsize, GFP_KERNEL | GFP_DMA);
  273. if (!tmpbuf)
  274. return -ENOMEM;
  275. spi_message_init(&msg);
  276. tmpbuf[0] = op->cmd.opcode;
  277. xfers[xferpos].tx_buf = tmpbuf;
  278. xfers[xferpos].len = op->cmd.nbytes;
  279. xfers[xferpos].tx_nbits = op->cmd.buswidth;
  280. spi_message_add_tail(&xfers[xferpos], &msg);
  281. xferpos++;
  282. totalxferlen++;
  283. if (op->addr.nbytes) {
  284. int i;
  285. for (i = 0; i < op->addr.nbytes; i++)
  286. tmpbuf[i + 1] = op->addr.val >>
  287. (8 * (op->addr.nbytes - i - 1));
  288. xfers[xferpos].tx_buf = tmpbuf + 1;
  289. xfers[xferpos].len = op->addr.nbytes;
  290. xfers[xferpos].tx_nbits = op->addr.buswidth;
  291. spi_message_add_tail(&xfers[xferpos], &msg);
  292. xferpos++;
  293. totalxferlen += op->addr.nbytes;
  294. }
  295. if (op->dummy.nbytes) {
  296. memset(tmpbuf + op->addr.nbytes + 1, 0xff, op->dummy.nbytes);
  297. xfers[xferpos].tx_buf = tmpbuf + op->addr.nbytes + 1;
  298. xfers[xferpos].len = op->dummy.nbytes;
  299. xfers[xferpos].tx_nbits = op->dummy.buswidth;
  300. spi_message_add_tail(&xfers[xferpos], &msg);
  301. xferpos++;
  302. totalxferlen += op->dummy.nbytes;
  303. }
  304. if (op->data.nbytes) {
  305. if (op->data.dir == SPI_MEM_DATA_IN) {
  306. xfers[xferpos].rx_buf = op->data.buf.in;
  307. xfers[xferpos].rx_nbits = op->data.buswidth;
  308. } else {
  309. xfers[xferpos].tx_buf = op->data.buf.out;
  310. xfers[xferpos].tx_nbits = op->data.buswidth;
  311. }
  312. xfers[xferpos].len = op->data.nbytes;
  313. spi_message_add_tail(&xfers[xferpos], &msg);
  314. xferpos++;
  315. totalxferlen += op->data.nbytes;
  316. }
  317. ret = spi_sync(slave, &msg);
  318. kfree(tmpbuf);
  319. if (ret)
  320. return ret;
  321. if (msg.actual_length != totalxferlen)
  322. return -EIO;
  323. #else
  324. if (op->data.nbytes) {
  325. if (op->data.dir == SPI_MEM_DATA_IN)
  326. rx_buf = op->data.buf.in;
  327. else
  328. tx_buf = op->data.buf.out;
  329. }
  330. op_len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
  331. /*
  332. * Avoid using malloc() here so that we can use this code in SPL where
  333. * simple malloc may be used. That implementation does not allow free()
  334. * so repeated calls to this code can exhaust the space.
  335. *
  336. * The value of op_len is small, since it does not include the actual
  337. * data being sent, only the op-code and address. In fact, it should be
  338. * possible to just use a small fixed value here instead of op_len.
  339. */
  340. u8 op_buf[op_len];
  341. op_buf[pos++] = op->cmd.opcode;
  342. if (op->addr.nbytes) {
  343. for (i = 0; i < op->addr.nbytes; i++)
  344. op_buf[pos + i] = op->addr.val >>
  345. (8 * (op->addr.nbytes - i - 1));
  346. pos += op->addr.nbytes;
  347. }
  348. if (op->dummy.nbytes)
  349. memset(op_buf + pos, 0xff, op->dummy.nbytes);
  350. /* 1st transfer: opcode + address + dummy cycles */
  351. flag = SPI_XFER_BEGIN;
  352. /* Make sure to set END bit if no tx or rx data messages follow */
  353. if (!tx_buf && !rx_buf)
  354. flag |= SPI_XFER_END;
  355. ret = spi_xfer(slave, op_len * 8, op_buf, NULL, flag);
  356. if (ret)
  357. return ret;
  358. /* 2nd transfer: rx or tx data path */
  359. if (tx_buf || rx_buf) {
  360. ret = spi_xfer(slave, op->data.nbytes * 8, tx_buf,
  361. rx_buf, SPI_XFER_END);
  362. if (ret)
  363. return ret;
  364. }
  365. spi_release_bus(slave);
  366. for (i = 0; i < pos; i++)
  367. debug("%02x ", op_buf[i]);
  368. debug("| [%dB %s] ",
  369. tx_buf || rx_buf ? op->data.nbytes : 0,
  370. tx_buf || rx_buf ? (tx_buf ? "out" : "in") : "-");
  371. for (i = 0; i < op->data.nbytes; i++)
  372. debug("%02x ", tx_buf ? tx_buf[i] : rx_buf[i]);
  373. debug("[ret %d]\n", ret);
  374. if (ret < 0)
  375. return ret;
  376. #endif /* __UBOOT__ */
  377. return 0;
  378. }
  379. EXPORT_SYMBOL_GPL(spi_mem_exec_op);
  380. /**
  381. * spi_mem_adjust_op_size() - Adjust the data size of a SPI mem operation to
  382. * match controller limitations
  383. * @slave: the SPI device
  384. * @op: the operation to adjust
  385. *
  386. * Some controllers have FIFO limitations and must split a data transfer
  387. * operation into multiple ones, others require a specific alignment for
  388. * optimized accesses. This function allows SPI mem drivers to split a single
  389. * operation into multiple sub-operations when required.
  390. *
  391. * Return: a negative error code if the controller can't properly adjust @op,
  392. * 0 otherwise. Note that @op->data.nbytes will be updated if @op
  393. * can't be handled in a single step.
  394. */
  395. int spi_mem_adjust_op_size(struct spi_slave *slave, struct spi_mem_op *op)
  396. {
  397. struct udevice *bus = slave->dev->parent;
  398. struct dm_spi_ops *ops = spi_get_ops(bus);
  399. if (ops->mem_ops && ops->mem_ops->adjust_op_size)
  400. return ops->mem_ops->adjust_op_size(slave, op);
  401. if (!ops->mem_ops || !ops->mem_ops->exec_op) {
  402. unsigned int len;
  403. len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
  404. if (slave->max_write_size && len > slave->max_write_size)
  405. return -EINVAL;
  406. if (op->data.dir == SPI_MEM_DATA_IN) {
  407. if (slave->max_read_size)
  408. op->data.nbytes = min(op->data.nbytes,
  409. slave->max_read_size);
  410. } else if (slave->max_write_size) {
  411. op->data.nbytes = min(op->data.nbytes,
  412. slave->max_write_size - len);
  413. }
  414. if (!op->data.nbytes)
  415. return -EINVAL;
  416. }
  417. return 0;
  418. }
  419. EXPORT_SYMBOL_GPL(spi_mem_adjust_op_size);
  420. static ssize_t spi_mem_no_dirmap_read(struct spi_mem_dirmap_desc *desc,
  421. u64 offs, size_t len, void *buf)
  422. {
  423. struct spi_mem_op op = desc->info.op_tmpl;
  424. int ret;
  425. op.addr.val = desc->info.offset + offs;
  426. op.data.buf.in = buf;
  427. op.data.nbytes = len;
  428. ret = spi_mem_adjust_op_size(desc->slave, &op);
  429. if (ret)
  430. return ret;
  431. ret = spi_mem_exec_op(desc->slave, &op);
  432. if (ret)
  433. return ret;
  434. return op.data.nbytes;
  435. }
  436. static ssize_t spi_mem_no_dirmap_write(struct spi_mem_dirmap_desc *desc,
  437. u64 offs, size_t len, const void *buf)
  438. {
  439. struct spi_mem_op op = desc->info.op_tmpl;
  440. int ret;
  441. op.addr.val = desc->info.offset + offs;
  442. op.data.buf.out = buf;
  443. op.data.nbytes = len;
  444. ret = spi_mem_adjust_op_size(desc->slave, &op);
  445. if (ret)
  446. return ret;
  447. ret = spi_mem_exec_op(desc->slave, &op);
  448. if (ret)
  449. return ret;
  450. return op.data.nbytes;
  451. }
  452. /**
  453. * spi_mem_dirmap_create() - Create a direct mapping descriptor
  454. * @mem: SPI mem device this direct mapping should be created for
  455. * @info: direct mapping information
  456. *
  457. * This function is creating a direct mapping descriptor which can then be used
  458. * to access the memory using spi_mem_dirmap_read() or spi_mem_dirmap_write().
  459. * If the SPI controller driver does not support direct mapping, this function
  460. * falls back to an implementation using spi_mem_exec_op(), so that the caller
  461. * doesn't have to bother implementing a fallback on his own.
  462. *
  463. * Return: a valid pointer in case of success, and ERR_PTR() otherwise.
  464. */
  465. struct spi_mem_dirmap_desc *
  466. spi_mem_dirmap_create(struct spi_slave *slave,
  467. const struct spi_mem_dirmap_info *info)
  468. {
  469. struct udevice *bus = slave->dev->parent;
  470. struct dm_spi_ops *ops = spi_get_ops(bus);
  471. struct spi_mem_dirmap_desc *desc;
  472. int ret = -EOPNOTSUPP;
  473. /* Make sure the number of address cycles is between 1 and 8 bytes. */
  474. if (!info->op_tmpl.addr.nbytes || info->op_tmpl.addr.nbytes > 8)
  475. return ERR_PTR(-EINVAL);
  476. /* data.dir should either be SPI_MEM_DATA_IN or SPI_MEM_DATA_OUT. */
  477. if (info->op_tmpl.data.dir == SPI_MEM_NO_DATA)
  478. return ERR_PTR(-EINVAL);
  479. desc = kzalloc(sizeof(*desc), GFP_KERNEL);
  480. if (!desc)
  481. return ERR_PTR(-ENOMEM);
  482. desc->slave = slave;
  483. desc->info = *info;
  484. if (ops->mem_ops && ops->mem_ops->dirmap_create)
  485. ret = ops->mem_ops->dirmap_create(desc);
  486. if (ret) {
  487. desc->nodirmap = true;
  488. if (!spi_mem_supports_op(desc->slave, &desc->info.op_tmpl))
  489. ret = -EOPNOTSUPP;
  490. else
  491. ret = 0;
  492. }
  493. if (ret) {
  494. kfree(desc);
  495. return ERR_PTR(ret);
  496. }
  497. return desc;
  498. }
  499. EXPORT_SYMBOL_GPL(spi_mem_dirmap_create);
  500. /**
  501. * spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor
  502. * @desc: the direct mapping descriptor to destroy
  503. *
  504. * This function destroys a direct mapping descriptor previously created by
  505. * spi_mem_dirmap_create().
  506. */
  507. void spi_mem_dirmap_destroy(struct spi_mem_dirmap_desc *desc)
  508. {
  509. struct udevice *bus = desc->slave->dev->parent;
  510. struct dm_spi_ops *ops = spi_get_ops(bus);
  511. if (!desc->nodirmap && ops->mem_ops && ops->mem_ops->dirmap_destroy)
  512. ops->mem_ops->dirmap_destroy(desc);
  513. kfree(desc);
  514. }
  515. EXPORT_SYMBOL_GPL(spi_mem_dirmap_destroy);
  516. #ifndef __UBOOT__
  517. static void devm_spi_mem_dirmap_release(struct udevice *dev, void *res)
  518. {
  519. struct spi_mem_dirmap_desc *desc = *(struct spi_mem_dirmap_desc **)res;
  520. spi_mem_dirmap_destroy(desc);
  521. }
  522. /**
  523. * devm_spi_mem_dirmap_create() - Create a direct mapping descriptor and attach
  524. * it to a device
  525. * @dev: device the dirmap desc will be attached to
  526. * @mem: SPI mem device this direct mapping should be created for
  527. * @info: direct mapping information
  528. *
  529. * devm_ variant of the spi_mem_dirmap_create() function. See
  530. * spi_mem_dirmap_create() for more details.
  531. *
  532. * Return: a valid pointer in case of success, and ERR_PTR() otherwise.
  533. */
  534. struct spi_mem_dirmap_desc *
  535. devm_spi_mem_dirmap_create(struct udevice *dev, struct spi_slave *slave,
  536. const struct spi_mem_dirmap_info *info)
  537. {
  538. struct spi_mem_dirmap_desc **ptr, *desc;
  539. ptr = devres_alloc(devm_spi_mem_dirmap_release, sizeof(*ptr),
  540. GFP_KERNEL);
  541. if (!ptr)
  542. return ERR_PTR(-ENOMEM);
  543. desc = spi_mem_dirmap_create(slave, info);
  544. if (IS_ERR(desc)) {
  545. devres_free(ptr);
  546. } else {
  547. *ptr = desc;
  548. devres_add(dev, ptr);
  549. }
  550. return desc;
  551. }
  552. EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_create);
  553. static int devm_spi_mem_dirmap_match(struct udevice *dev, void *res, void *data)
  554. {
  555. struct spi_mem_dirmap_desc **ptr = res;
  556. if (WARN_ON(!ptr || !*ptr))
  557. return 0;
  558. return *ptr == data;
  559. }
  560. /**
  561. * devm_spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor attached
  562. * to a device
  563. * @dev: device the dirmap desc is attached to
  564. * @desc: the direct mapping descriptor to destroy
  565. *
  566. * devm_ variant of the spi_mem_dirmap_destroy() function. See
  567. * spi_mem_dirmap_destroy() for more details.
  568. */
  569. void devm_spi_mem_dirmap_destroy(struct udevice *dev,
  570. struct spi_mem_dirmap_desc *desc)
  571. {
  572. devres_release(dev, devm_spi_mem_dirmap_release,
  573. devm_spi_mem_dirmap_match, desc);
  574. }
  575. EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_destroy);
  576. #endif /* __UBOOT__ */
  577. /**
  578. * spi_mem_dirmap_read() - Read data through a direct mapping
  579. * @desc: direct mapping descriptor
  580. * @offs: offset to start reading from. Note that this is not an absolute
  581. * offset, but the offset within the direct mapping which already has
  582. * its own offset
  583. * @len: length in bytes
  584. * @buf: destination buffer. This buffer must be DMA-able
  585. *
  586. * This function reads data from a memory device using a direct mapping
  587. * previously instantiated with spi_mem_dirmap_create().
  588. *
  589. * Return: the amount of data read from the memory device or a negative error
  590. * code. Note that the returned size might be smaller than @len, and the caller
  591. * is responsible for calling spi_mem_dirmap_read() again when that happens.
  592. */
  593. ssize_t spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
  594. u64 offs, size_t len, void *buf)
  595. {
  596. struct udevice *bus = desc->slave->dev->parent;
  597. struct dm_spi_ops *ops = spi_get_ops(bus);
  598. ssize_t ret;
  599. if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
  600. return -EINVAL;
  601. if (!len)
  602. return 0;
  603. if (desc->nodirmap)
  604. ret = spi_mem_no_dirmap_read(desc, offs, len, buf);
  605. else if (ops->mem_ops && ops->mem_ops->dirmap_read)
  606. ret = ops->mem_ops->dirmap_read(desc, offs, len, buf);
  607. else
  608. ret = -EOPNOTSUPP;
  609. return ret;
  610. }
  611. EXPORT_SYMBOL_GPL(spi_mem_dirmap_read);
  612. /**
  613. * spi_mem_dirmap_write() - Write data through a direct mapping
  614. * @desc: direct mapping descriptor
  615. * @offs: offset to start writing from. Note that this is not an absolute
  616. * offset, but the offset within the direct mapping which already has
  617. * its own offset
  618. * @len: length in bytes
  619. * @buf: source buffer. This buffer must be DMA-able
  620. *
  621. * This function writes data to a memory device using a direct mapping
  622. * previously instantiated with spi_mem_dirmap_create().
  623. *
  624. * Return: the amount of data written to the memory device or a negative error
  625. * code. Note that the returned size might be smaller than @len, and the caller
  626. * is responsible for calling spi_mem_dirmap_write() again when that happens.
  627. */
  628. ssize_t spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
  629. u64 offs, size_t len, const void *buf)
  630. {
  631. struct udevice *bus = desc->slave->dev->parent;
  632. struct dm_spi_ops *ops = spi_get_ops(bus);
  633. ssize_t ret;
  634. if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_OUT)
  635. return -EINVAL;
  636. if (!len)
  637. return 0;
  638. if (desc->nodirmap)
  639. ret = spi_mem_no_dirmap_write(desc, offs, len, buf);
  640. else if (ops->mem_ops && ops->mem_ops->dirmap_write)
  641. ret = ops->mem_ops->dirmap_write(desc, offs, len, buf);
  642. else
  643. ret = -EOPNOTSUPP;
  644. return ret;
  645. }
  646. EXPORT_SYMBOL_GPL(spi_mem_dirmap_write);
  647. #ifndef __UBOOT__
  648. static inline struct spi_mem_driver *to_spi_mem_drv(struct device_driver *drv)
  649. {
  650. return container_of(drv, struct spi_mem_driver, spidrv.driver);
  651. }
  652. static int spi_mem_probe(struct spi_device *spi)
  653. {
  654. struct spi_mem_driver *memdrv = to_spi_mem_drv(spi->dev.driver);
  655. struct spi_mem *mem;
  656. mem = devm_kzalloc(&spi->dev, sizeof(*mem), GFP_KERNEL);
  657. if (!mem)
  658. return -ENOMEM;
  659. mem->spi = spi;
  660. spi_set_drvdata(spi, mem);
  661. return memdrv->probe(mem);
  662. }
  663. static int spi_mem_remove(struct spi_device *spi)
  664. {
  665. struct spi_mem_driver *memdrv = to_spi_mem_drv(spi->dev.driver);
  666. struct spi_mem *mem = spi_get_drvdata(spi);
  667. if (memdrv->remove)
  668. return memdrv->remove(mem);
  669. return 0;
  670. }
  671. static void spi_mem_shutdown(struct spi_device *spi)
  672. {
  673. struct spi_mem_driver *memdrv = to_spi_mem_drv(spi->dev.driver);
  674. struct spi_mem *mem = spi_get_drvdata(spi);
  675. if (memdrv->shutdown)
  676. memdrv->shutdown(mem);
  677. }
  678. /**
  679. * spi_mem_driver_register_with_owner() - Register a SPI memory driver
  680. * @memdrv: the SPI memory driver to register
  681. * @owner: the owner of this driver
  682. *
  683. * Registers a SPI memory driver.
  684. *
  685. * Return: 0 in case of success, a negative error core otherwise.
  686. */
  687. int spi_mem_driver_register_with_owner(struct spi_mem_driver *memdrv,
  688. struct module *owner)
  689. {
  690. memdrv->spidrv.probe = spi_mem_probe;
  691. memdrv->spidrv.remove = spi_mem_remove;
  692. memdrv->spidrv.shutdown = spi_mem_shutdown;
  693. return __spi_register_driver(owner, &memdrv->spidrv);
  694. }
  695. EXPORT_SYMBOL_GPL(spi_mem_driver_register_with_owner);
  696. /**
  697. * spi_mem_driver_unregister_with_owner() - Unregister a SPI memory driver
  698. * @memdrv: the SPI memory driver to unregister
  699. *
  700. * Unregisters a SPI memory driver.
  701. */
  702. void spi_mem_driver_unregister(struct spi_mem_driver *memdrv)
  703. {
  704. spi_unregister_driver(&memdrv->spidrv);
  705. }
  706. EXPORT_SYMBOL_GPL(spi_mem_driver_unregister);
  707. #endif /* __UBOOT__ */