xilinx_spi.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Xilinx SPI driver
  4. *
  5. * Supports 8 bit SPI transfers only, with or w/o FIFO
  6. *
  7. * Based on bfin_spi.c, by way of altera_spi.c
  8. * Copyright (c) 2015 Jagan Teki <jteki@openedev.com>
  9. * Copyright (c) 2012 Stephan Linz <linz@li-pro.net>
  10. * Copyright (c) 2010 Graeme Smecher <graeme.smecher@mail.mcgill.ca>
  11. * Copyright (c) 2010 Thomas Chou <thomas@wytron.com.tw>
  12. * Copyright (c) 2005-2008 Analog Devices Inc.
  13. */
  14. #include <config.h>
  15. #include <common.h>
  16. #include <dm.h>
  17. #include <errno.h>
  18. #include <log.h>
  19. #include <malloc.h>
  20. #include <spi.h>
  21. #include <spi-mem.h>
  22. #include <asm/io.h>
  23. #include <wait_bit.h>
  24. #include <linux/bitops.h>
  25. /*
  26. * [0]: http://www.xilinx.com/support/documentation
  27. *
  28. * Xilinx SPI Register Definitions
  29. * [1]: [0]/ip_documentation/xps_spi.pdf
  30. * page 8, Register Descriptions
  31. * [2]: [0]/ip_documentation/axi_spi_ds742.pdf
  32. * page 7, Register Overview Table
  33. */
  34. /* SPI Control Register (spicr), [1] p9, [2] p8 */
  35. #define SPICR_LSB_FIRST BIT(9)
  36. #define SPICR_MASTER_INHIBIT BIT(8)
  37. #define SPICR_MANUAL_SS BIT(7)
  38. #define SPICR_RXFIFO_RESEST BIT(6)
  39. #define SPICR_TXFIFO_RESEST BIT(5)
  40. #define SPICR_CPHA BIT(4)
  41. #define SPICR_CPOL BIT(3)
  42. #define SPICR_MASTER_MODE BIT(2)
  43. #define SPICR_SPE BIT(1)
  44. #define SPICR_LOOP BIT(0)
  45. /* SPI Status Register (spisr), [1] p11, [2] p10 */
  46. #define SPISR_SLAVE_MODE_SELECT BIT(5)
  47. #define SPISR_MODF BIT(4)
  48. #define SPISR_TX_FULL BIT(3)
  49. #define SPISR_TX_EMPTY BIT(2)
  50. #define SPISR_RX_FULL BIT(1)
  51. #define SPISR_RX_EMPTY BIT(0)
  52. /* SPI Data Transmit Register (spidtr), [1] p12, [2] p12 */
  53. #define SPIDTR_8BIT_MASK GENMASK(7, 0)
  54. #define SPIDTR_16BIT_MASK GENMASK(15, 0)
  55. #define SPIDTR_32BIT_MASK GENMASK(31, 0)
  56. /* SPI Data Receive Register (spidrr), [1] p12, [2] p12 */
  57. #define SPIDRR_8BIT_MASK GENMASK(7, 0)
  58. #define SPIDRR_16BIT_MASK GENMASK(15, 0)
  59. #define SPIDRR_32BIT_MASK GENMASK(31, 0)
  60. /* SPI Slave Select Register (spissr), [1] p13, [2] p13 */
  61. #define SPISSR_MASK(cs) (1 << (cs))
  62. #define SPISSR_ACT(cs) ~SPISSR_MASK(cs)
  63. #define SPISSR_OFF ~0UL
  64. /* SPI Software Reset Register (ssr) */
  65. #define SPISSR_RESET_VALUE 0x0a
  66. #define XILSPI_MAX_XFER_BITS 8
  67. #define XILSPI_SPICR_DFLT_ON (SPICR_MANUAL_SS | SPICR_MASTER_MODE | \
  68. SPICR_SPE | SPICR_MASTER_INHIBIT)
  69. #define XILSPI_SPICR_DFLT_OFF (SPICR_MASTER_INHIBIT | SPICR_MANUAL_SS)
  70. #define XILINX_SPI_IDLE_VAL GENMASK(7, 0)
  71. #define XILINX_SPISR_TIMEOUT 10000 /* in milliseconds */
  72. /* xilinx spi register set */
  73. struct xilinx_spi_regs {
  74. u32 __space0__[7];
  75. u32 dgier; /* Device Global Interrupt Enable Register (DGIER) */
  76. u32 ipisr; /* IP Interrupt Status Register (IPISR) */
  77. u32 __space1__;
  78. u32 ipier; /* IP Interrupt Enable Register (IPIER) */
  79. u32 __space2__[5];
  80. u32 srr; /* Softare Reset Register (SRR) */
  81. u32 __space3__[7];
  82. u32 spicr; /* SPI Control Register (SPICR) */
  83. u32 spisr; /* SPI Status Register (SPISR) */
  84. u32 spidtr; /* SPI Data Transmit Register (SPIDTR) */
  85. u32 spidrr; /* SPI Data Receive Register (SPIDRR) */
  86. u32 spissr; /* SPI Slave Select Register (SPISSR) */
  87. u32 spitfor; /* SPI Transmit FIFO Occupancy Register (SPITFOR) */
  88. u32 spirfor; /* SPI Receive FIFO Occupancy Register (SPIRFOR) */
  89. };
  90. /* xilinx spi priv */
  91. struct xilinx_spi_priv {
  92. struct xilinx_spi_regs *regs;
  93. unsigned int freq;
  94. unsigned int mode;
  95. unsigned int fifo_depth;
  96. u8 startup;
  97. };
  98. static int xilinx_spi_probe(struct udevice *bus)
  99. {
  100. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  101. struct xilinx_spi_regs *regs;
  102. regs = priv->regs = dev_read_addr_ptr(bus);
  103. priv->fifo_depth = dev_read_u32_default(bus, "fifo-size", 0);
  104. writel(SPISSR_RESET_VALUE, &regs->srr);
  105. /*
  106. * Reset RX & TX FIFO
  107. * Enable Manual Slave Select Assertion,
  108. * Set SPI controller into master mode, and enable it
  109. */
  110. writel(SPICR_RXFIFO_RESEST | SPICR_TXFIFO_RESEST |
  111. SPICR_MANUAL_SS | SPICR_MASTER_MODE | SPICR_SPE,
  112. &regs->spicr);
  113. return 0;
  114. }
  115. static void spi_cs_activate(struct udevice *dev, uint cs)
  116. {
  117. struct udevice *bus = dev_get_parent(dev);
  118. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  119. struct xilinx_spi_regs *regs = priv->regs;
  120. writel(SPISSR_ACT(cs), &regs->spissr);
  121. }
  122. static void spi_cs_deactivate(struct udevice *dev)
  123. {
  124. struct udevice *bus = dev_get_parent(dev);
  125. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  126. struct xilinx_spi_regs *regs = priv->regs;
  127. u32 reg;
  128. reg = readl(&regs->spicr) | SPICR_RXFIFO_RESEST | SPICR_TXFIFO_RESEST;
  129. writel(reg, &regs->spicr);
  130. writel(SPISSR_OFF, &regs->spissr);
  131. }
  132. static int xilinx_spi_claim_bus(struct udevice *dev)
  133. {
  134. struct udevice *bus = dev_get_parent(dev);
  135. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  136. struct xilinx_spi_regs *regs = priv->regs;
  137. writel(SPISSR_OFF, &regs->spissr);
  138. writel(XILSPI_SPICR_DFLT_ON, &regs->spicr);
  139. return 0;
  140. }
  141. static int xilinx_spi_release_bus(struct udevice *dev)
  142. {
  143. struct udevice *bus = dev_get_parent(dev);
  144. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  145. struct xilinx_spi_regs *regs = priv->regs;
  146. writel(SPISSR_OFF, &regs->spissr);
  147. writel(XILSPI_SPICR_DFLT_OFF, &regs->spicr);
  148. return 0;
  149. }
  150. static u32 xilinx_spi_fill_txfifo(struct udevice *bus, const u8 *txp,
  151. u32 txbytes)
  152. {
  153. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  154. struct xilinx_spi_regs *regs = priv->regs;
  155. unsigned char d;
  156. u32 i = 0;
  157. while (txbytes && !(readl(&regs->spisr) & SPISR_TX_FULL) &&
  158. i < priv->fifo_depth) {
  159. d = txp ? *txp++ : XILINX_SPI_IDLE_VAL;
  160. debug("spi_xfer: tx:%x ", d);
  161. /* write out and wait for processing (receive data) */
  162. writel(d & SPIDTR_8BIT_MASK, &regs->spidtr);
  163. txbytes--;
  164. i++;
  165. }
  166. return i;
  167. }
  168. static u32 xilinx_spi_read_rxfifo(struct udevice *bus, u8 *rxp, u32 rxbytes)
  169. {
  170. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  171. struct xilinx_spi_regs *regs = priv->regs;
  172. unsigned char d;
  173. unsigned int i = 0;
  174. while (rxbytes && !(readl(&regs->spisr) & SPISR_RX_EMPTY)) {
  175. d = readl(&regs->spidrr) & SPIDRR_8BIT_MASK;
  176. if (rxp)
  177. *rxp++ = d;
  178. debug("spi_xfer: rx:%x\n", d);
  179. rxbytes--;
  180. i++;
  181. }
  182. debug("Rx_done\n");
  183. return i;
  184. }
  185. static int start_transfer(struct spi_slave *spi, const void *dout, void *din, u32 len)
  186. {
  187. struct udevice *bus = spi->dev->parent;
  188. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  189. struct xilinx_spi_regs *regs = priv->regs;
  190. u32 count, txbytes, rxbytes;
  191. int reg, ret;
  192. const unsigned char *txp = (const unsigned char *)dout;
  193. unsigned char *rxp = (unsigned char *)din;
  194. txbytes = len;
  195. rxbytes = len;
  196. while (txbytes || rxbytes) {
  197. /* Disable master transaction */
  198. reg = readl(&regs->spicr) | SPICR_MASTER_INHIBIT;
  199. writel(reg, &regs->spicr);
  200. count = xilinx_spi_fill_txfifo(bus, txp, txbytes);
  201. /* Enable master transaction */
  202. reg = readl(&regs->spicr) & ~SPICR_MASTER_INHIBIT;
  203. writel(reg, &regs->spicr);
  204. txbytes -= count;
  205. if (txp)
  206. txp += count;
  207. ret = wait_for_bit_le32(&regs->spisr, SPISR_TX_EMPTY, true,
  208. XILINX_SPISR_TIMEOUT, false);
  209. if (ret < 0) {
  210. printf("XILSPI error: Xfer timeout\n");
  211. return ret;
  212. }
  213. reg = readl(&regs->spicr) | SPICR_MASTER_INHIBIT;
  214. writel(reg, &regs->spicr);
  215. count = xilinx_spi_read_rxfifo(bus, rxp, rxbytes);
  216. rxbytes -= count;
  217. if (rxp)
  218. rxp += count;
  219. }
  220. return 0;
  221. }
  222. static void xilinx_spi_startup_block(struct spi_slave *spi)
  223. {
  224. struct dm_spi_slave_plat *slave_plat =
  225. dev_get_parent_plat(spi->dev);
  226. unsigned char txp;
  227. unsigned char rxp[8];
  228. /*
  229. * Perform a dummy read as a work around for
  230. * the startup block issue.
  231. */
  232. spi_cs_activate(spi->dev, slave_plat->cs);
  233. txp = 0x9f;
  234. start_transfer(spi, (void *)&txp, NULL, 1);
  235. start_transfer(spi, NULL, (void *)rxp, 6);
  236. spi_cs_deactivate(spi->dev);
  237. }
  238. static int xilinx_spi_mem_exec_op(struct spi_slave *spi,
  239. const struct spi_mem_op *op)
  240. {
  241. struct dm_spi_slave_plat *slave_plat =
  242. dev_get_parent_plat(spi->dev);
  243. static u32 startup;
  244. u32 dummy_len, ret;
  245. /*
  246. * This is the work around for the startup block issue in
  247. * the spi controller. SPI clock is passing through STARTUP
  248. * block to FLASH. STARTUP block don't provide clock as soon
  249. * as QSPI provides command. So first command fails.
  250. */
  251. if (!startup) {
  252. xilinx_spi_startup_block(spi);
  253. startup++;
  254. }
  255. spi_cs_activate(spi->dev, slave_plat->cs);
  256. if (op->cmd.opcode) {
  257. ret = start_transfer(spi, (void *)&op->cmd.opcode, NULL, 1);
  258. if (ret)
  259. goto done;
  260. }
  261. if (op->addr.nbytes) {
  262. int i;
  263. u8 addr_buf[4];
  264. for (i = 0; i < op->addr.nbytes; i++)
  265. addr_buf[i] = op->addr.val >>
  266. (8 * (op->addr.nbytes - i - 1));
  267. ret = start_transfer(spi, (void *)addr_buf, NULL,
  268. op->addr.nbytes);
  269. if (ret)
  270. goto done;
  271. }
  272. if (op->dummy.nbytes) {
  273. dummy_len = (op->dummy.nbytes * op->data.buswidth) /
  274. op->dummy.buswidth;
  275. ret = start_transfer(spi, NULL, NULL, dummy_len);
  276. if (ret)
  277. goto done;
  278. }
  279. if (op->data.nbytes) {
  280. if (op->data.dir == SPI_MEM_DATA_IN) {
  281. ret = start_transfer(spi, NULL,
  282. op->data.buf.in, op->data.nbytes);
  283. } else {
  284. ret = start_transfer(spi, op->data.buf.out,
  285. NULL, op->data.nbytes);
  286. }
  287. if (ret)
  288. goto done;
  289. }
  290. done:
  291. spi_cs_deactivate(spi->dev);
  292. return ret;
  293. }
  294. static int xilinx_qspi_check_buswidth(struct spi_slave *slave, u8 width)
  295. {
  296. u32 mode = slave->mode;
  297. switch (width) {
  298. case 1:
  299. return 0;
  300. case 2:
  301. if (mode & SPI_RX_DUAL)
  302. return 0;
  303. break;
  304. case 4:
  305. if (mode & SPI_RX_QUAD)
  306. return 0;
  307. break;
  308. }
  309. return -EOPNOTSUPP;
  310. }
  311. static bool xilinx_qspi_mem_exec_op(struct spi_slave *slave,
  312. const struct spi_mem_op *op)
  313. {
  314. if (xilinx_qspi_check_buswidth(slave, op->cmd.buswidth))
  315. return false;
  316. if (op->addr.nbytes &&
  317. xilinx_qspi_check_buswidth(slave, op->addr.buswidth))
  318. return false;
  319. if (op->dummy.nbytes &&
  320. xilinx_qspi_check_buswidth(slave, op->dummy.buswidth))
  321. return false;
  322. if (op->data.dir != SPI_MEM_NO_DATA &&
  323. xilinx_qspi_check_buswidth(slave, op->data.buswidth))
  324. return false;
  325. return true;
  326. }
  327. static int xilinx_spi_set_speed(struct udevice *bus, uint speed)
  328. {
  329. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  330. priv->freq = speed;
  331. debug("%s: regs=%p, speed=%d\n", __func__, priv->regs, priv->freq);
  332. return 0;
  333. }
  334. static int xilinx_spi_set_mode(struct udevice *bus, uint mode)
  335. {
  336. struct xilinx_spi_priv *priv = dev_get_priv(bus);
  337. struct xilinx_spi_regs *regs = priv->regs;
  338. u32 spicr;
  339. spicr = readl(&regs->spicr);
  340. if (mode & SPI_LSB_FIRST)
  341. spicr |= SPICR_LSB_FIRST;
  342. if (mode & SPI_CPHA)
  343. spicr |= SPICR_CPHA;
  344. if (mode & SPI_CPOL)
  345. spicr |= SPICR_CPOL;
  346. if (mode & SPI_LOOP)
  347. spicr |= SPICR_LOOP;
  348. writel(spicr, &regs->spicr);
  349. priv->mode = mode;
  350. debug("%s: regs=%p, mode=%d\n", __func__, priv->regs, priv->mode);
  351. return 0;
  352. }
  353. static const struct spi_controller_mem_ops xilinx_spi_mem_ops = {
  354. .exec_op = xilinx_spi_mem_exec_op,
  355. .supports_op = xilinx_qspi_mem_exec_op,
  356. };
  357. static const struct dm_spi_ops xilinx_spi_ops = {
  358. .claim_bus = xilinx_spi_claim_bus,
  359. .release_bus = xilinx_spi_release_bus,
  360. .set_speed = xilinx_spi_set_speed,
  361. .set_mode = xilinx_spi_set_mode,
  362. .mem_ops = &xilinx_spi_mem_ops,
  363. };
  364. static const struct udevice_id xilinx_spi_ids[] = {
  365. { .compatible = "xlnx,xps-spi-2.00.a" },
  366. { .compatible = "xlnx,xps-spi-2.00.b" },
  367. { }
  368. };
  369. U_BOOT_DRIVER(xilinx_spi) = {
  370. .name = "xilinx_spi",
  371. .id = UCLASS_SPI,
  372. .of_match = xilinx_spi_ids,
  373. .ops = &xilinx_spi_ops,
  374. .priv_auto = sizeof(struct xilinx_spi_priv),
  375. .probe = xilinx_spi_probe,
  376. };