davinci_spi.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
  4. *
  5. * Driver for SPI controller on DaVinci. Based on atmel_spi.c
  6. * by Atmel Corporation
  7. *
  8. * Copyright (C) 2007 Atmel Corporation
  9. */
  10. #include <common.h>
  11. #include <log.h>
  12. #include <spi.h>
  13. #include <malloc.h>
  14. #include <asm/global_data.h>
  15. #include <asm/io.h>
  16. #include <asm/arch/hardware.h>
  17. #include <dm.h>
  18. #include <dm/platform_data/spi_davinci.h>
  19. #include <linux/bitops.h>
  20. #include <linux/delay.h>
  21. /* SPIGCR0 */
  22. #define SPIGCR0_SPIENA_MASK 0x1
  23. #define SPIGCR0_SPIRST_MASK 0x0
  24. /* SPIGCR0 */
  25. #define SPIGCR1_CLKMOD_MASK BIT(1)
  26. #define SPIGCR1_MASTER_MASK BIT(0)
  27. #define SPIGCR1_SPIENA_MASK BIT(24)
  28. /* SPIPC0 */
  29. #define SPIPC0_DIFUN_MASK BIT(11) /* SIMO */
  30. #define SPIPC0_DOFUN_MASK BIT(10) /* SOMI */
  31. #define SPIPC0_CLKFUN_MASK BIT(9) /* CLK */
  32. #define SPIPC0_EN0FUN_MASK BIT(0)
  33. /* SPIFMT0 */
  34. #define SPIFMT_SHIFTDIR_SHIFT 20
  35. #define SPIFMT_POLARITY_SHIFT 17
  36. #define SPIFMT_PHASE_SHIFT 16
  37. #define SPIFMT_PRESCALE_SHIFT 8
  38. /* SPIDAT1 */
  39. #define SPIDAT1_CSHOLD_SHIFT 28
  40. #define SPIDAT1_CSNR_SHIFT 16
  41. /* SPIDELAY */
  42. #define SPI_C2TDELAY_SHIFT 24
  43. #define SPI_T2CDELAY_SHIFT 16
  44. /* SPIBUF */
  45. #define SPIBUF_RXEMPTY_MASK BIT(31)
  46. #define SPIBUF_TXFULL_MASK BIT(29)
  47. /* SPIDEF */
  48. #define SPIDEF_CSDEF0_MASK BIT(0)
  49. DECLARE_GLOBAL_DATA_PTR;
  50. /* davinci spi register set */
  51. struct davinci_spi_regs {
  52. dv_reg gcr0; /* 0x00 */
  53. dv_reg gcr1; /* 0x04 */
  54. dv_reg int0; /* 0x08 */
  55. dv_reg lvl; /* 0x0c */
  56. dv_reg flg; /* 0x10 */
  57. dv_reg pc0; /* 0x14 */
  58. dv_reg pc1; /* 0x18 */
  59. dv_reg pc2; /* 0x1c */
  60. dv_reg pc3; /* 0x20 */
  61. dv_reg pc4; /* 0x24 */
  62. dv_reg pc5; /* 0x28 */
  63. dv_reg rsvd[3];
  64. dv_reg dat0; /* 0x38 */
  65. dv_reg dat1; /* 0x3c */
  66. dv_reg buf; /* 0x40 */
  67. dv_reg emu; /* 0x44 */
  68. dv_reg delay; /* 0x48 */
  69. dv_reg def; /* 0x4c */
  70. dv_reg fmt0; /* 0x50 */
  71. dv_reg fmt1; /* 0x54 */
  72. dv_reg fmt2; /* 0x58 */
  73. dv_reg fmt3; /* 0x5c */
  74. dv_reg intvec0; /* 0x60 */
  75. dv_reg intvec1; /* 0x64 */
  76. };
  77. /* davinci spi slave */
  78. struct davinci_spi_slave {
  79. struct davinci_spi_regs *regs;
  80. unsigned int freq; /* current SPI bus frequency */
  81. unsigned int mode; /* current SPI mode used */
  82. u8 num_cs; /* total no. of CS available */
  83. u8 cur_cs; /* CS of current slave */
  84. bool half_duplex; /* true, if master is half-duplex only */
  85. };
  86. /*
  87. * This functions needs to act like a macro to avoid pipeline reloads in the
  88. * loops below. Use always_inline. This gains us about 160KiB/s and the bloat
  89. * appears to be zero bytes (da830).
  90. */
  91. __attribute__((always_inline))
  92. static inline u32 davinci_spi_xfer_data(struct davinci_spi_slave *ds, u32 data)
  93. {
  94. u32 buf_reg_val;
  95. /* send out data */
  96. writel(data, &ds->regs->dat1);
  97. /* wait for the data to clock in/out */
  98. while ((buf_reg_val = readl(&ds->regs->buf)) & SPIBUF_RXEMPTY_MASK)
  99. ;
  100. return buf_reg_val;
  101. }
  102. static int davinci_spi_read(struct davinci_spi_slave *ds, unsigned int len,
  103. u8 *rxp, unsigned long flags)
  104. {
  105. unsigned int data1_reg_val;
  106. /* enable CS hold, CS[n] and clear the data bits */
  107. data1_reg_val = ((1 << SPIDAT1_CSHOLD_SHIFT) |
  108. (ds->cur_cs << SPIDAT1_CSNR_SHIFT));
  109. /* wait till TXFULL is deasserted */
  110. while (readl(&ds->regs->buf) & SPIBUF_TXFULL_MASK)
  111. ;
  112. /* preload the TX buffer to avoid clock starvation */
  113. writel(data1_reg_val, &ds->regs->dat1);
  114. /* keep reading 1 byte until only 1 byte left */
  115. while ((len--) > 1)
  116. *rxp++ = davinci_spi_xfer_data(ds, data1_reg_val);
  117. /* clear CS hold when we reach the end */
  118. if (flags & SPI_XFER_END)
  119. data1_reg_val &= ~(1 << SPIDAT1_CSHOLD_SHIFT);
  120. /* read the last byte */
  121. *rxp = davinci_spi_xfer_data(ds, data1_reg_val);
  122. return 0;
  123. }
  124. static int davinci_spi_write(struct davinci_spi_slave *ds, unsigned int len,
  125. const u8 *txp, unsigned long flags)
  126. {
  127. unsigned int data1_reg_val;
  128. /* enable CS hold and clear the data bits */
  129. data1_reg_val = ((1 << SPIDAT1_CSHOLD_SHIFT) |
  130. (ds->cur_cs << SPIDAT1_CSNR_SHIFT));
  131. /* wait till TXFULL is deasserted */
  132. while (readl(&ds->regs->buf) & SPIBUF_TXFULL_MASK)
  133. ;
  134. /* preload the TX buffer to avoid clock starvation */
  135. if (len > 2) {
  136. writel(data1_reg_val | *txp++, &ds->regs->dat1);
  137. len--;
  138. }
  139. /* keep writing 1 byte until only 1 byte left */
  140. while ((len--) > 1)
  141. davinci_spi_xfer_data(ds, data1_reg_val | *txp++);
  142. /* clear CS hold when we reach the end */
  143. if (flags & SPI_XFER_END)
  144. data1_reg_val &= ~(1 << SPIDAT1_CSHOLD_SHIFT);
  145. /* write the last byte */
  146. davinci_spi_xfer_data(ds, data1_reg_val | *txp);
  147. return 0;
  148. }
  149. static int davinci_spi_read_write(struct davinci_spi_slave *ds, unsigned
  150. int len, u8 *rxp, const u8 *txp,
  151. unsigned long flags)
  152. {
  153. unsigned int data1_reg_val;
  154. /* enable CS hold and clear the data bits */
  155. data1_reg_val = ((1 << SPIDAT1_CSHOLD_SHIFT) |
  156. (ds->cur_cs << SPIDAT1_CSNR_SHIFT));
  157. /* wait till TXFULL is deasserted */
  158. while (readl(&ds->regs->buf) & SPIBUF_TXFULL_MASK)
  159. ;
  160. /* keep reading and writing 1 byte until only 1 byte left */
  161. while ((len--) > 1)
  162. *rxp++ = davinci_spi_xfer_data(ds, data1_reg_val | *txp++);
  163. /* clear CS hold when we reach the end */
  164. if (flags & SPI_XFER_END)
  165. data1_reg_val &= ~(1 << SPIDAT1_CSHOLD_SHIFT);
  166. /* read and write the last byte */
  167. *rxp = davinci_spi_xfer_data(ds, data1_reg_val | *txp);
  168. return 0;
  169. }
  170. static int __davinci_spi_claim_bus(struct davinci_spi_slave *ds, int cs)
  171. {
  172. unsigned int mode = 0, scalar;
  173. /* Enable the SPI hardware */
  174. writel(SPIGCR0_SPIRST_MASK, &ds->regs->gcr0);
  175. udelay(1000);
  176. writel(SPIGCR0_SPIENA_MASK, &ds->regs->gcr0);
  177. /* Set master mode, powered up and not activated */
  178. writel(SPIGCR1_MASTER_MASK | SPIGCR1_CLKMOD_MASK, &ds->regs->gcr1);
  179. /* CS, CLK, SIMO and SOMI are functional pins */
  180. writel(((1 << cs) | SPIPC0_CLKFUN_MASK |
  181. SPIPC0_DOFUN_MASK | SPIPC0_DIFUN_MASK), &ds->regs->pc0);
  182. /* setup format */
  183. scalar = ((CFG_SYS_SPI_CLK / ds->freq) - 1) & 0xFF;
  184. /*
  185. * Use following format:
  186. * character length = 8,
  187. * MSB shifted out first
  188. */
  189. if (ds->mode & SPI_CPOL)
  190. mode |= SPI_CPOL;
  191. if (!(ds->mode & SPI_CPHA))
  192. mode |= SPI_CPHA;
  193. writel(8 | (scalar << SPIFMT_PRESCALE_SHIFT) |
  194. (mode << SPIFMT_PHASE_SHIFT), &ds->regs->fmt0);
  195. /*
  196. * Including a minor delay. No science here. Should be good even with
  197. * no delay
  198. */
  199. writel((50 << SPI_C2TDELAY_SHIFT) |
  200. (50 << SPI_T2CDELAY_SHIFT), &ds->regs->delay);
  201. /* default chip select register */
  202. writel(SPIDEF_CSDEF0_MASK, &ds->regs->def);
  203. /* no interrupts */
  204. writel(0, &ds->regs->int0);
  205. writel(0, &ds->regs->lvl);
  206. /* enable SPI */
  207. writel((readl(&ds->regs->gcr1) | SPIGCR1_SPIENA_MASK), &ds->regs->gcr1);
  208. return 0;
  209. }
  210. static int __davinci_spi_release_bus(struct davinci_spi_slave *ds)
  211. {
  212. /* Disable the SPI hardware */
  213. writel(SPIGCR0_SPIRST_MASK, &ds->regs->gcr0);
  214. return 0;
  215. }
  216. static int __davinci_spi_xfer(struct davinci_spi_slave *ds,
  217. unsigned int bitlen, const void *dout, void *din,
  218. unsigned long flags)
  219. {
  220. unsigned int len;
  221. if (bitlen == 0)
  222. /* Finish any previously submitted transfers */
  223. goto out;
  224. /*
  225. * It's not clear how non-8-bit-aligned transfers are supposed to be
  226. * represented as a stream of bytes...this is a limitation of
  227. * the current SPI interface - here we terminate on receiving such a
  228. * transfer request.
  229. */
  230. if (bitlen % 8) {
  231. /* Errors always terminate an ongoing transfer */
  232. flags |= SPI_XFER_END;
  233. goto out;
  234. }
  235. len = bitlen / 8;
  236. if (!dout)
  237. return davinci_spi_read(ds, len, din, flags);
  238. if (!din)
  239. return davinci_spi_write(ds, len, dout, flags);
  240. if (!ds->half_duplex)
  241. return davinci_spi_read_write(ds, len, din, dout, flags);
  242. printf("SPI full duplex not supported\n");
  243. flags |= SPI_XFER_END;
  244. out:
  245. if (flags & SPI_XFER_END) {
  246. u8 dummy = 0;
  247. davinci_spi_write(ds, 1, &dummy, flags);
  248. }
  249. return 0;
  250. }
  251. static int davinci_spi_set_speed(struct udevice *bus, uint max_hz)
  252. {
  253. struct davinci_spi_slave *ds = dev_get_priv(bus);
  254. debug("%s speed %u\n", __func__, max_hz);
  255. if (max_hz > CFG_SYS_SPI_CLK / 2)
  256. return -EINVAL;
  257. ds->freq = max_hz;
  258. return 0;
  259. }
  260. static int davinci_spi_set_mode(struct udevice *bus, uint mode)
  261. {
  262. struct davinci_spi_slave *ds = dev_get_priv(bus);
  263. debug("%s mode %u\n", __func__, mode);
  264. ds->mode = mode;
  265. return 0;
  266. }
  267. static int davinci_spi_claim_bus(struct udevice *dev)
  268. {
  269. struct dm_spi_slave_plat *slave_plat =
  270. dev_get_parent_plat(dev);
  271. struct udevice *bus = dev->parent;
  272. struct davinci_spi_slave *ds = dev_get_priv(bus);
  273. if (slave_plat->cs >= ds->num_cs) {
  274. printf("Invalid SPI chipselect\n");
  275. return -EINVAL;
  276. }
  277. ds->half_duplex = slave_plat->mode & SPI_PREAMBLE;
  278. return __davinci_spi_claim_bus(ds, slave_plat->cs);
  279. }
  280. static int davinci_spi_release_bus(struct udevice *dev)
  281. {
  282. struct davinci_spi_slave *ds = dev_get_priv(dev->parent);
  283. return __davinci_spi_release_bus(ds);
  284. }
  285. static int davinci_spi_xfer(struct udevice *dev, unsigned int bitlen,
  286. const void *dout, void *din,
  287. unsigned long flags)
  288. {
  289. struct dm_spi_slave_plat *slave =
  290. dev_get_parent_plat(dev);
  291. struct udevice *bus = dev->parent;
  292. struct davinci_spi_slave *ds = dev_get_priv(bus);
  293. if (slave->cs >= ds->num_cs) {
  294. printf("Invalid SPI chipselect\n");
  295. return -EINVAL;
  296. }
  297. ds->cur_cs = slave->cs;
  298. return __davinci_spi_xfer(ds, bitlen, dout, din, flags);
  299. }
  300. static const struct dm_spi_ops davinci_spi_ops = {
  301. .claim_bus = davinci_spi_claim_bus,
  302. .release_bus = davinci_spi_release_bus,
  303. .xfer = davinci_spi_xfer,
  304. .set_speed = davinci_spi_set_speed,
  305. .set_mode = davinci_spi_set_mode,
  306. };
  307. static int davinci_spi_probe(struct udevice *bus)
  308. {
  309. struct davinci_spi_slave *ds = dev_get_priv(bus);
  310. struct davinci_spi_plat *plat = dev_get_plat(bus);
  311. ds->regs = plat->regs;
  312. ds->num_cs = plat->num_cs;
  313. return 0;
  314. }
  315. #if CONFIG_IS_ENABLED(OF_REAL)
  316. static int davinci_ofdata_to_platadata(struct udevice *bus)
  317. {
  318. struct davinci_spi_plat *plat = dev_get_plat(bus);
  319. fdt_addr_t addr;
  320. addr = dev_read_addr(bus);
  321. if (addr == FDT_ADDR_T_NONE)
  322. return -EINVAL;
  323. plat->regs = (struct davinci_spi_regs *)addr;
  324. plat->num_cs = fdtdec_get_int(gd->fdt_blob, dev_of_offset(bus), "num-cs", 4);
  325. return 0;
  326. }
  327. static const struct udevice_id davinci_spi_ids[] = {
  328. { .compatible = "ti,keystone-spi" },
  329. { .compatible = "ti,dm6441-spi" },
  330. { .compatible = "ti,da830-spi" },
  331. { }
  332. };
  333. #endif
  334. U_BOOT_DRIVER(davinci_spi) = {
  335. .name = "davinci_spi",
  336. .id = UCLASS_SPI,
  337. #if CONFIG_IS_ENABLED(OF_REAL)
  338. .of_match = davinci_spi_ids,
  339. .of_to_plat = davinci_ofdata_to_platadata,
  340. .plat_auto = sizeof(struct davinci_spi_plat),
  341. #endif
  342. .probe = davinci_spi_probe,
  343. .ops = &davinci_spi_ops,
  344. .priv_auto = sizeof(struct davinci_spi_slave),
  345. };