spi-dw.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __SPI_DW_H__
  3. #define __SPI_DW_H__
  4. #include <linux/bits.h>
  5. #include <linux/completion.h>
  6. #include <linux/debugfs.h>
  7. #include <linux/irqreturn.h>
  8. #include <linux/io.h>
  9. #include <linux/scatterlist.h>
  10. #include <linux/spi/spi-mem.h>
  11. #include <linux/bitfield.h>
  12. /* Synopsys DW SSI IP-core virtual IDs */
  13. #define DW_PSSI_ID 0
  14. #define DW_HSSI_ID 1
  15. /* Synopsys DW SSI component versions (FourCC sequence) */
  16. #define DW_HSSI_102A 0x3130322a
  17. #define DW_HSSI_100A 0x3130302a
  18. #define DW_PSSI_400A 0x3430302a
  19. /* DW SSI IP-core ID and version check helpers */
  20. #define dw_spi_ip_is(_dws, _ip) \
  21. ((_dws)->ip == DW_ ## _ip ## _ID)
  22. #define __dw_spi_ver_cmp(_dws, _ip, _ver, _op) \
  23. (dw_spi_ip_is(_dws, _ip) && (_dws)->ver _op DW_ ## _ip ## _ ## _ver)
  24. #define dw_spi_ver_is(_dws, _ip, _ver) __dw_spi_ver_cmp(_dws, _ip, _ver, ==)
  25. #define dw_spi_ver_is_ge(_dws, _ip, _ver) __dw_spi_ver_cmp(_dws, _ip, _ver, >=)
  26. /* DW SPI controller capabilities */
  27. #define DW_SPI_CAP_CS_OVERRIDE BIT(0)
  28. #define DW_SPI_CAP_DFS32 BIT(1)
  29. #define DW_SPI_CAP_EMODE BIT(2)
  30. /* Register offsets (Generic for both DWC APB SSI and DWC SSI IP-cores) */
  31. #define DW_SPI_CTRLR0 0x00
  32. #define DW_SPI_CTRLR1 0x04
  33. #define DW_SPI_SSIENR 0x08
  34. #define DW_SPI_MWCR 0x0c
  35. #define DW_SPI_SER 0x10
  36. #define DW_SPI_BAUDR 0x14
  37. #define DW_SPI_TXFTLR 0x18
  38. #define DW_SPI_RXFTLR 0x1c
  39. #define DW_SPI_TXFLR 0x20
  40. #define DW_SPI_RXFLR 0x24
  41. #define DW_SPI_SR 0x28
  42. #define DW_SPI_IMR 0x2c
  43. #define DW_SPI_ISR 0x30
  44. #define DW_SPI_RISR 0x34
  45. #define DW_SPI_TXOICR 0x38
  46. #define DW_SPI_RXOICR 0x3c
  47. #define DW_SPI_RXUICR 0x40
  48. #define DW_SPI_MSTICR 0x44
  49. #define DW_SPI_ICR 0x48
  50. #define DW_SPI_DMACR 0x4c
  51. #define DW_SPI_DMATDLR 0x50
  52. #define DW_SPI_DMARDLR 0x54
  53. #define DW_SPI_IDR 0x58
  54. #define DW_SPI_VERSION 0x5c
  55. #define DW_SPI_DR 0x60
  56. #define DW_SPI_RX_SAMPLE_DLY 0xf0
  57. #define DW_SPI_CS_OVERRIDE 0xf4
  58. #define DW_SPI_SPI_CTRLR0 0xf4
  59. /* Bit fields in CTRLR0 (DWC APB SSI) */
  60. #define DW_PSSI_CTRLR0_DFS_MASK GENMASK(3, 0)
  61. #define DW_PSSI_CTRLR0_DFS32_MASK GENMASK(20, 16)
  62. #define DW_PSSI_CTRLR0_FRF_MASK GENMASK(5, 4)
  63. #define DW_SPI_CTRLR0_FRF_MOTO_SPI 0x0
  64. #define DW_SPI_CTRLR0_FRF_TI_SSP 0x1
  65. #define DW_SPI_CTRLR0_FRF_NS_MICROWIRE 0x2
  66. #define DW_SPI_CTRLR0_FRF_RESV 0x3
  67. #define DW_PSSI_CTRLR0_MODE_MASK GENMASK(7, 6)
  68. #define DW_PSSI_CTRLR0_SCPHA BIT(6)
  69. #define DW_PSSI_CTRLR0_SCPOL BIT(7)
  70. #define DW_PSSI_CTRLR0_TMOD_MASK GENMASK(9, 8)
  71. #define DW_SPI_CTRLR0_TMOD_TR 0x0 /* xmit & recv */
  72. #define DW_SPI_CTRLR0_TMOD_TO 0x1 /* xmit only */
  73. #define DW_SPI_CTRLR0_TMOD_RO 0x2 /* recv only */
  74. #define DW_SPI_CTRLR0_TMOD_EPROMREAD 0x3 /* eeprom read mode */
  75. #define DW_PSSI_CTRLR0_SLV_OE BIT(10)
  76. #define DW_PSSI_CTRLR0_SRL BIT(11)
  77. #define DW_PSSI_CTRLR0_CFS BIT(12)
  78. /* Bit fields in CTRLR0 (DWC SSI with AHB interface) */
  79. #define DW_HSSI_CTRLR0_DFS_MASK GENMASK(4, 0)
  80. #define DW_HSSI_CTRLR0_FRF_MASK GENMASK(7, 6)
  81. #define DW_HSSI_CTRLR0_SCPHA BIT(8)
  82. #define DW_HSSI_CTRLR0_SCPOL BIT(9)
  83. #define DW_HSSI_CTRLR0_TMOD_MASK GENMASK(11, 10)
  84. #define DW_HSSI_CTRLR0_SRL BIT(13)
  85. #define DW_HSSI_CTRLR0_MST BIT(31)
  86. #define DW_HSSI_CTRLR0_SPI_FRF_MASK GENMASK(23, 22)
  87. #define DW_PSSI_CTRLR0_SPI_FRF_MASK GENMASK(22, 21)
  88. #define DW_SPI_CTRLR0_SPI_FRF_STD_SPI 0x0
  89. #define DW_SPI_CTRLR0_SPI_FRF_DUAL_SPI 0x1
  90. #define DW_SPI_CTRLR0_SPI_FRF_QUAD_SPI 0x2
  91. #define DW_SPI_CTRLR0_SPI_FRF_OCT_SPI 0x3
  92. /* Bit fields in CTRLR1 */
  93. #define DW_SPI_NDF_MASK GENMASK(15, 0)
  94. /* Bit fields in SR, 7 bits */
  95. #define DW_SPI_SR_MASK GENMASK(6, 0)
  96. #define DW_SPI_SR_BUSY BIT(0)
  97. #define DW_SPI_SR_TF_NOT_FULL BIT(1)
  98. #define DW_SPI_SR_TF_EMPT BIT(2)
  99. #define DW_SPI_SR_RF_NOT_EMPT BIT(3)
  100. #define DW_SPI_SR_RF_FULL BIT(4)
  101. #define DW_SPI_SR_TX_ERR BIT(5)
  102. #define DW_SPI_SR_DCOL BIT(6)
  103. /* Bit fields in ISR, IMR, RISR, 7 bits */
  104. #define DW_SPI_INT_MASK GENMASK(5, 0)
  105. #define DW_SPI_INT_TXEI BIT(0)
  106. #define DW_SPI_INT_TXOI BIT(1)
  107. #define DW_SPI_INT_RXUI BIT(2)
  108. #define DW_SPI_INT_RXOI BIT(3)
  109. #define DW_SPI_INT_RXFI BIT(4)
  110. #define DW_SPI_INT_MSTI BIT(5)
  111. /* Bit fields in DMACR */
  112. #define DW_SPI_DMACR_RDMAE BIT(0)
  113. #define DW_SPI_DMACR_TDMAE BIT(1)
  114. #define DW_SPI_SPI_CTRLR0_WAIT_CYCLE_MASK GENMASK(15, 11)
  115. #define DW_SPI_SPI_CTRLR0_INST_L_MASK GENMASK(9, 8)
  116. #define DW_SPI_SPI_CTRLR0_INST_L_INST_L0 0x0
  117. #define DW_SPI_SPI_CTRLR0_INST_L_INST_L8 0x2
  118. #define DW_SPI_SPI_CTRLR0_INST_L_INST_L16 0x3
  119. #define DW_SPI_SPI_CTRLR0_ADDR_L_MASK GENMASK(5, 2)
  120. #define DW_SPI_SPI_CTRLR0_TRANS_TYPE_TT0 0x0
  121. #define DW_SPI_SPI_CTRLR0_TRANS_TYPE_TT1 0x1
  122. #define DW_SPI_SPI_CTRLR0_TRANS_TYPE_TT2 0x2
  123. /* Mem/DMA operations helpers */
  124. #define DW_SPI_WAIT_RETRIES 5
  125. #define DW_SPI_BUF_SIZE \
  126. (sizeof_field(struct spi_mem_op, cmd.opcode) + \
  127. sizeof_field(struct spi_mem_op, addr.val) + 256)
  128. #define DW_SPI_GET_BYTE(_val, _idx) \
  129. ((_val) >> (BITS_PER_BYTE * (_idx)) & 0xff)
  130. /* Slave spi_transfer/spi_mem_op related */
  131. struct dw_spi_cfg {
  132. u8 tmode;
  133. u8 dfs;
  134. u32 ndf;
  135. u32 freq;
  136. u8 spi_frf;
  137. u8 trans_t;
  138. u8 inst_l;
  139. u8 addr_l;
  140. u8 wait_c;
  141. };
  142. struct dw_spi;
  143. struct dw_spi_dma_ops {
  144. int (*dma_init)(struct device *dev, struct dw_spi *dws);
  145. void (*dma_exit)(struct dw_spi *dws);
  146. int (*dma_setup)(struct dw_spi *dws, struct spi_transfer *xfer);
  147. bool (*can_dma)(struct spi_controller *host, struct spi_device *spi,
  148. struct spi_transfer *xfer);
  149. int (*dma_transfer)(struct dw_spi *dws, struct spi_transfer *xfer);
  150. void (*dma_stop)(struct dw_spi *dws);
  151. };
  152. struct dw_spi {
  153. struct spi_controller *host;
  154. u32 ip; /* Synopsys DW SSI IP-core ID */
  155. u32 ver; /* Synopsys component version */
  156. u32 caps; /* DW SPI capabilities */
  157. void __iomem *regs;
  158. unsigned long paddr;
  159. int irq;
  160. u32 fifo_len; /* depth of the FIFO buffer */
  161. unsigned int dfs_offset; /* CTRLR0 DFS field offset */
  162. u32 max_mem_freq; /* max mem-ops bus freq */
  163. u32 max_freq; /* max bus freq supported */
  164. u32 reg_io_width; /* DR I/O width in bytes */
  165. u32 num_cs; /* chip select lines */
  166. u16 bus_num;
  167. void (*set_cs)(struct spi_device *spi, bool enable);
  168. /* Current message transfer state info */
  169. void *tx;
  170. unsigned int tx_len;
  171. void *rx;
  172. unsigned int rx_len;
  173. u8 buf[DW_SPI_BUF_SIZE];
  174. int dma_mapped;
  175. u8 n_bytes; /* current is a 1/2 bytes op */
  176. irqreturn_t (*transfer_handler)(struct dw_spi *dws);
  177. u32 current_freq; /* frequency in hz */
  178. u32 cur_rx_sample_dly;
  179. u32 def_rx_sample_dly_ns;
  180. /* Custom memory operations */
  181. struct spi_controller_mem_ops mem_ops;
  182. /* DMA info */
  183. struct dma_chan *txchan;
  184. u32 txburst;
  185. struct dma_chan *rxchan;
  186. u32 rxburst;
  187. u32 dma_sg_burst;
  188. u32 dma_addr_widths;
  189. unsigned long dma_chan_busy;
  190. dma_addr_t dma_addr; /* phy address of the Data register */
  191. const struct dw_spi_dma_ops *dma_ops;
  192. struct completion dma_completion;
  193. #ifdef CONFIG_DEBUG_FS
  194. struct dentry *debugfs;
  195. struct debugfs_regset32 regset;
  196. #endif
  197. };
  198. static inline u32 dw_readl(struct dw_spi *dws, u32 offset)
  199. {
  200. return __raw_readl(dws->regs + offset);
  201. }
  202. static inline void dw_writel(struct dw_spi *dws, u32 offset, u32 val)
  203. {
  204. __raw_writel(val, dws->regs + offset);
  205. }
  206. static inline u32 dw_read_io_reg(struct dw_spi *dws, u32 offset)
  207. {
  208. switch (dws->reg_io_width) {
  209. case 2:
  210. return readw_relaxed(dws->regs + offset);
  211. case 4:
  212. default:
  213. return readl_relaxed(dws->regs + offset);
  214. }
  215. }
  216. static inline void dw_write_io_reg(struct dw_spi *dws, u32 offset, u32 val)
  217. {
  218. switch (dws->reg_io_width) {
  219. case 2:
  220. writew_relaxed(val, dws->regs + offset);
  221. break;
  222. case 4:
  223. default:
  224. writel_relaxed(val, dws->regs + offset);
  225. break;
  226. }
  227. }
  228. static inline void dw_spi_enable_chip(struct dw_spi *dws, int enable)
  229. {
  230. dw_writel(dws, DW_SPI_SSIENR, (enable ? 1 : 0));
  231. }
  232. static inline void dw_spi_set_clk(struct dw_spi *dws, u16 div)
  233. {
  234. dw_writel(dws, DW_SPI_BAUDR, div);
  235. }
  236. /* Disable IRQ bits */
  237. static inline void dw_spi_mask_intr(struct dw_spi *dws, u32 mask)
  238. {
  239. u32 new_mask;
  240. new_mask = dw_readl(dws, DW_SPI_IMR) & ~mask;
  241. dw_writel(dws, DW_SPI_IMR, new_mask);
  242. }
  243. /* Enable IRQ bits */
  244. static inline void dw_spi_umask_intr(struct dw_spi *dws, u32 mask)
  245. {
  246. u32 new_mask;
  247. new_mask = dw_readl(dws, DW_SPI_IMR) | mask;
  248. dw_writel(dws, DW_SPI_IMR, new_mask);
  249. }
  250. /*
  251. * This disables the SPI controller, interrupts, clears the interrupts status
  252. * and CS, then re-enables the controller back. Transmit and receive FIFO
  253. * buffers are cleared when the device is disabled.
  254. */
  255. static inline void dw_spi_reset_chip(struct dw_spi *dws)
  256. {
  257. dw_spi_enable_chip(dws, 0);
  258. dw_spi_mask_intr(dws, 0xff);
  259. dw_readl(dws, DW_SPI_ICR);
  260. dw_writel(dws, DW_SPI_SER, 0);
  261. dw_spi_enable_chip(dws, 1);
  262. }
  263. static inline void dw_spi_shutdown_chip(struct dw_spi *dws)
  264. {
  265. dw_spi_enable_chip(dws, 0);
  266. dw_spi_set_clk(dws, 0);
  267. }
  268. extern void dw_spi_set_cs(struct spi_device *spi, bool enable);
  269. extern void dw_spi_update_config(struct dw_spi *dws, struct spi_device *spi,
  270. struct dw_spi_cfg *cfg);
  271. extern int dw_spi_check_status(struct dw_spi *dws, bool raw);
  272. extern int dw_spi_add_host(struct device *dev, struct dw_spi *dws);
  273. extern void dw_spi_remove_host(struct dw_spi *dws);
  274. extern int dw_spi_suspend_host(struct dw_spi *dws);
  275. extern int dw_spi_resume_host(struct dw_spi *dws);
  276. #ifdef CONFIG_SPI_DW_DMA
  277. extern void dw_spi_dma_setup_mfld(struct dw_spi *dws);
  278. extern void dw_spi_dma_setup_generic(struct dw_spi *dws);
  279. #else
  280. static inline void dw_spi_dma_setup_mfld(struct dw_spi *dws) {}
  281. static inline void dw_spi_dma_setup_generic(struct dw_spi *dws) {}
  282. #endif /* !CONFIG_SPI_DW_DMA */
  283. #endif /* __SPI_DW_H__ */