drv_spi.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. /*
  2. * File : board_spi_master.h
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2008 - 2012, RT-Thread Development Team
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. *
  20. * Change Logs:
  21. * Date Author Notes
  22. * 2015-11-19 Urey the first version
  23. */
  24. #ifndef DRV_SPI_H__
  25. #define DRV_SPI_H__
  26. #include <rtthread.h>
  27. #include <rtdevice.h>
  28. #include "board.h"
  29. #include "drv_gpio.h"
  30. /* SSI REGISTER */
  31. #define SSI_DR 0x00
  32. #define SSI_CR0 0x04
  33. #define SSI_CR1 0x08
  34. #define SSI_SR 0x0C
  35. #define SSI_ITR 0x10
  36. #define SSI_ICR 0x14
  37. #define SSI_GR 0x18
  38. /* SSI Data Register (SSI_DR) */
  39. #define DR_GPC_BIT 0
  40. #define DR_GPC_MASK (0x1ff << SSI_DR_GPC_BIT)
  41. /* SSI Control Register 0 (SSI_CR0) */
  42. #define CR0_TENDIAN_BIT 18
  43. #define CR0_TENDIAN_MASK (3 << CR0_TENDIAN_BIT)
  44. #define CR0_RENDIAN_BIT 16
  45. #define CR0_RENDIAN_MASK (3 << CR0_RENDIAN_BIT)
  46. #define CR0_SSIE (1 << 15)
  47. #define CR0_TIE (1 << 14)
  48. #define CR0_RIE (1 << 13)
  49. #define CR0_TEIE (1 << 12)
  50. #define CR0_REIE (1 << 11)
  51. #define CR0_LOOP (1 << 10)
  52. #define CR0_RFINE (1 << 9)
  53. #define CR0_RFINC (1 << 8)
  54. #define CR0_EACLRUN (1 << 7) /* hardware auto clear underrun when TxFifo no empty */
  55. #define CR0_FSEL (1 << 6)
  56. #define CR0_VRCNT (1 << 4)
  57. #define CR0_TFMODE (1 << 3)
  58. #define CR0_TFLUSH (1 << 2)
  59. #define CR0_RFLUSH (1 << 1)
  60. #define CR0_DISREV (1 << 0)
  61. /* SSI Control Register 1 (SSI_CR1) */
  62. #define CR1_FRMHL_BIT 30
  63. #define CR1_FRMHL_MASK (0x3 << CR1_FRMHL_BIT)
  64. #define CR1_FRMHL_CELOW_CE2LOW (0 << CR1_FRMHL_BIT) /* SSI_CE_ is low valid and SSI_CE2_ is low valid */
  65. #define CR1_FRMHL_CEHIGH_CE2LOW (1 << CR1_FRMHL_BIT) /* SSI_CE_ is high valid and SSI_CE2_ is low valid */
  66. #define CR1_FRMHL_CELOW_CE2HIGH (2 << CR1_FRMHL_BIT) /* SSI_CE_ is low valid and SSI_CE2_ is high valid */
  67. #define CR1_FRMHL_CEHIGH_CE2HIGH (3 << CR1_FRMHL_BIT) /* SSI_CE_ is high valid and SSI_CE2_ is high valid */
  68. #define CR1_TFVCK_BIT 28
  69. #define CR1_TFVCK_MASK (0x3 << CR1_TFVCK_BIT)
  70. #define CR1_TFVCK_0 (0 << CR1_TFVCK_BIT)
  71. #define CR1_TFVCK_1 (1 << CR1_TFVCK_BIT)
  72. #define CR1_TFVCK_2 (2 << CR1_TFVCK_BIT)
  73. #define CR1_TFVCK_3 (3 << CR1_TFVCK_BIT)
  74. #define CR1_TCKFI_BIT 26
  75. #define CR1_TCKFI_MASK (0x3 << CR1_TCKFI_BIT)
  76. #define CR1_TCKFI_0 (0 << CR1_TCKFI_BIT)
  77. #define CR1_TCKFI_1 (1 << CR1_TCKFI_BIT)
  78. #define CR1_TCKFI_2 (2 << CR1_TCKFI_BIT)
  79. #define CR1_TCKFI_3 (3 << CR1_TCKFI_BIT)
  80. #define CR1_ITFRM (1 << 24)
  81. #define CR1_UNFIN (1 << 23)
  82. #define CR1_FMAT_BIT 20
  83. #define CR1_FMAT_MASK (0x3 << CR1_FMAT_BIT)
  84. #define CR1_FMAT_SPI (0 << CR1_FMAT_BIT) /* Motorola¡¯s SPI format */
  85. #define CR1_FMAT_SSP (1 << CR1_FMAT_BIT) /* TI's SSP format */
  86. #define CR1_FMAT_MW1 (2 << CR1_FMAT_BIT) /* National Microwire 1 format */
  87. #define CR1_FMAT_MW2 (3 << CR1_FMAT_BIT) /* National Microwire 2 format */
  88. #define CR1_TTRG_BIT 16 /* SSI1 TX trigger */
  89. #define CR1_TTRG_MASK (0xf << CR1_TTRG_BIT)
  90. #define CR1_MCOM_BIT 12
  91. #define CR1_MCOM_MASK (0xf << CR1_MCOM_BIT)
  92. // #define CR1_MCOM_BIT(NO) (##NO## << CR1_MCOM_BIT) /* N-bit command selected */
  93. #define CR1_RTRG_BIT 8 /* SSI RX trigger */
  94. #define CR1_RTRG_MASK (0xf << CR1_RTRG_BIT)
  95. #define CR1_FLEN_BIT 3
  96. #define CR1_FLEN_MASK (0x1f << CR1_FLEN_BIT)
  97. #define CR1_FLEN_2BIT (0x0 << CR1_FLEN_BIT)
  98. #define CR1_PHA (1 << 1)
  99. #define CR1_POL (1 << 0)
  100. /* SSI Status Register (SSI_SR) */
  101. #define SR_TFIFONUM_BIT 16
  102. #define SR_TFIFONUM_MASK (0xff << SR_TFIFONUM_BIT)
  103. #define SR_RFIFONUM_BIT 8
  104. #define SR_RFIFONUM_MASK (0xff << SR_RFIFONUM_BIT)
  105. #define SR_END (1 << 7)
  106. #define SR_BUSY (1 << 6)
  107. #define SR_TFF (1 << 5)
  108. #define SR_RFE (1 << 4)
  109. #define SR_TFHE (1 << 3)
  110. #define SR_RFHF (1 << 2)
  111. #define SR_UNDR (1 << 1)
  112. #define SR_OVER (1 << 0)
  113. /* SSI Interval Time Control Register (SSI_ITR) */
  114. #define ITR_CNTCLK (1 << 15)
  115. #define ITR_IVLTM_BIT 0
  116. #define ITR_IVLTM_MASK (0x7fff << ITR_IVLTM_BIT)
  117. #define R_MODE 0x1
  118. #define W_MODE 0x2
  119. #define RW_MODE (R_MODE | W_MODE)
  120. #define R_DMA 0x4
  121. #define W_DMA 0x8
  122. #define RW_DMA (R_DMA |W_DMA)
  123. #define SPI_DMA_ACK 0x1
  124. #define SPI_DMA_ERROR -3
  125. #define SPI_CPU_ERROR -4
  126. #define SPI_COMPLETE 5
  127. #define JZ_SSI_MAX_FIFO_ENTRIES 128
  128. #define JZ_SSI_DMA_BURST_LENGTH 16
  129. #define FIFO_W8 8
  130. #define FIFO_W16 16
  131. #define FIFO_W32 32
  132. #define SPI_BITS_8 8
  133. #define SPI_BITS_16 16
  134. #define SPI_BITS_32 32
  135. #define SPI_8BITS 1
  136. #define SPI_16BITS 2
  137. #define SPI_32BITS 4
  138. /* tx rx threshold from 0x0 to 0xF */
  139. #define SSI_FULL_THRESHOLD 0xF
  140. #define SSI_TX_FIFO_THRESHOLD 0x1
  141. #define SSI_RX_FIFO_THRESHOLD (SSI_FULL_THRESHOLD - SSI_TX_FIFO_THRESHOLD)
  142. #define SSI_SAFE_THRESHOLD 0x1
  143. #define CPU_ONCE_BLOCK_ENTRIES ((SSI_FULL_THRESHOLD-SSI_TX_FIFO_THRESHOLD)*8)
  144. #define MAX_SSI_INTR 10000
  145. #define MAX_SSICDR 63
  146. #define MAX_CGV 255
  147. #define SSI_DMA_FASTNESS_CHNL 0 // SSI controller [n] FASTNESS when probe();
  148. #define JZ_NEW_CODE_TYPE
  149. #define BUFFER_SIZE PAGE_SIZE
  150. #define CONFIG_DMA_ENGINE 1
  151. #define SUSPND (1<<0)
  152. #define SPIBUSY (1<<1)
  153. #define RXBUSY (1<<2)
  154. #define TXBUSY (1<<3)
  155. struct jz_spi_rx_fifo
  156. {
  157. /* software fifo */
  158. rt_uint8_t *buffer;
  159. rt_uint16_t put_index, get_index;
  160. };
  161. struct jz_spi_tx_fifo
  162. {
  163. struct rt_completion completion;
  164. };
  165. struct jz_spi_rx_dma
  166. {
  167. rt_bool_t activated;
  168. };
  169. struct jz_spi_tx_dma
  170. {
  171. rt_bool_t activated;
  172. struct rt_data_queue data_queue;
  173. };
  174. typedef struct jz_spi
  175. {
  176. struct rt_spi_bus parent;
  177. // struct rt_semaphore spi_done_sem;
  178. struct rt_completion completion;
  179. struct clk *clk;
  180. struct clk *clk_gate;
  181. uint32_t base;
  182. uint8_t is_first;
  183. uint8_t xfer_unit_size; /* 1,2,4 */
  184. uint32_t totalCount;
  185. uint32_t sendCount;
  186. uint32_t recvCount;
  187. uint8_t tx_trigger; /* 0-128 */
  188. uint8_t rx_trigger; /* 0-128 */
  189. uint8_t *rx_buf;
  190. uint8_t *tx_buf;
  191. uint32_t (*rx_func)(struct jz_spi *);
  192. uint32_t (*tx_func)(struct jz_spi *);
  193. }jz_spi_bus_t;
  194. struct jz_spi_cs
  195. {
  196. enum gpio_port port;
  197. enum gpio_pin pin;
  198. };
  199. static uint32_t spi_readl(struct jz_spi *spi_bus,uint32_t offset)
  200. {
  201. return readl(spi_bus->base + offset);
  202. }
  203. static void spi_writel(struct jz_spi *spi_bus, uint32_t offset,uint32_t value)
  204. {
  205. writel(value, spi_bus->base + offset);
  206. }
  207. static inline void spi_set_frmhl(struct jz_spi *spi, unsigned int frmhl)
  208. {
  209. u32 tmp;
  210. tmp = spi_readl(spi, SSI_CR1);
  211. tmp = (tmp & ~CR1_FRMHL_MASK) | frmhl;
  212. spi_writel(spi, SSI_CR1, tmp);
  213. }
  214. static inline void spi_set_clock_phase(struct jz_spi *spi, unsigned int cpha)
  215. {
  216. u32 tmp;
  217. tmp = spi_readl(spi, SSI_CR1);
  218. tmp = (tmp & ~CR1_PHA) | (cpha ? CR1_PHA : 0);
  219. spi_writel(spi, SSI_CR1, tmp);
  220. }
  221. static inline void spi_set_clock_polarity(struct jz_spi *spi, unsigned int cpol)
  222. {
  223. u32 tmp;
  224. tmp = spi_readl(spi, SSI_CR1);
  225. tmp = (tmp & ~CR1_POL) | (cpol ? CR1_POL : 0);
  226. spi_writel(spi, SSI_CR1, tmp);
  227. }
  228. static inline void spi_set_tx_msb(struct jz_spi *spi)
  229. {
  230. u32 tmp;
  231. tmp = spi_readl(spi, SSI_CR0);
  232. tmp &= ~CR0_TENDIAN_MASK;
  233. spi_writel(spi, SSI_CR0, tmp);
  234. }
  235. static inline void spi_set_tx_lsb(struct jz_spi *spi)
  236. {
  237. u32 tmp;
  238. tmp = spi_readl(spi, SSI_CR0);
  239. tmp |= (tmp & ~CR0_TENDIAN_MASK) | (0x3 << CR0_TENDIAN_BIT);
  240. spi_writel(spi, SSI_CR0, tmp);
  241. }
  242. static inline void spi_set_rx_msb(struct jz_spi *spi)
  243. {
  244. u32 tmp;
  245. tmp = spi_readl(spi, SSI_CR0);
  246. tmp &= ~CR0_RENDIAN_MASK;
  247. spi_writel(spi, SSI_CR0, tmp);
  248. }
  249. static inline void spi_set_rx_lsb(struct jz_spi *spi)
  250. {
  251. u32 tmp;
  252. tmp = spi_readl(spi, SSI_CR0);
  253. tmp |= (tmp & ~CR0_RENDIAN_MASK) | (0x3 << CR0_RENDIAN_BIT);
  254. spi_writel(spi, SSI_CR0, tmp);
  255. }
  256. static inline void spi_enable_loopback(struct jz_spi *spi)
  257. {
  258. u32 tmp;
  259. tmp = spi_readl(spi, SSI_CR0);
  260. tmp |= CR0_LOOP;
  261. spi_writel(spi, SSI_CR0, tmp);
  262. }
  263. static inline void spi_disable_loopback(struct jz_spi *spi)
  264. {
  265. u32 tmp;
  266. tmp = spi_readl(spi, SSI_CR0);
  267. tmp &= ~CR0_LOOP;
  268. spi_writel(spi, SSI_CR0, tmp);
  269. }
  270. static inline void spi_set_frame_length(struct jz_spi *spi, u32 len)
  271. {
  272. u32 tmp;
  273. tmp = spi_readl(spi, SSI_CR1);
  274. tmp = (tmp & ~CR1_FLEN_MASK) | (((len) - 2) << CR1_FLEN_BIT);
  275. spi_writel(spi, SSI_CR1, tmp);
  276. }
  277. static inline void spi_set_tx_trigger(struct jz_spi *spi, u32 val)
  278. {
  279. u32 tmp;
  280. tmp = spi_readl(spi, SSI_CR1);
  281. tmp = (tmp & ~CR1_TTRG_MASK) | ((val)/8) << CR1_TTRG_BIT;
  282. spi_writel(spi, SSI_CR1, tmp);
  283. }
  284. static inline void spi_set_rx_trigger(struct jz_spi *spi, u32 val)
  285. {
  286. u32 tmp;
  287. tmp = spi_readl(spi, SSI_CR1);
  288. tmp = (tmp & ~CR1_RTRG_MASK) | ((val)/8) << CR1_RTRG_BIT;
  289. spi_writel(spi, SSI_CR1, tmp);
  290. }
  291. static inline void spi_enable_txfifo_half_empty_intr(struct jz_spi *spi)
  292. {
  293. u32 tmp;
  294. tmp = spi_readl(spi, SSI_CR0);
  295. tmp |= CR0_TIE;
  296. spi_writel(spi, SSI_CR0, tmp);
  297. }
  298. static inline void spi_disable_txfifo_half_empty_intr(struct jz_spi *spi)
  299. {
  300. u32 tmp;
  301. tmp = spi_readl(spi, SSI_CR0);
  302. tmp &= ~CR0_TIE;
  303. spi_writel(spi, SSI_CR0, tmp);
  304. }
  305. static inline void spi_enable_rxfifo_half_full_intr(struct jz_spi *spi)
  306. {
  307. u32 tmp;
  308. tmp = spi_readl(spi, SSI_CR0);
  309. tmp |= CR0_RIE;
  310. spi_writel(spi, SSI_CR0, tmp);
  311. }
  312. static inline void spi_disable_rxfifo_half_full_intr(struct jz_spi *spi)
  313. {
  314. u32 tmp;
  315. tmp = spi_readl(spi, SSI_CR0);
  316. tmp &= ~CR0_RIE;
  317. spi_writel(spi, SSI_CR0, tmp);
  318. }
  319. static inline void spi_enable_tx_intr(struct jz_spi *spi)
  320. {
  321. u32 tmp;
  322. tmp = spi_readl(spi, SSI_CR0);
  323. tmp |= CR0_TIE | CR0_TEIE;
  324. spi_writel(spi, SSI_CR0, tmp);
  325. }
  326. static inline void spi_disable_tx_intr(struct jz_spi *spi)
  327. {
  328. u32 tmp;
  329. tmp = spi_readl(spi, SSI_CR0);
  330. tmp &= ~(CR0_TIE | CR0_TEIE);
  331. spi_writel(spi, SSI_CR0, tmp);
  332. }
  333. static inline void spi_enable_rx_intr(struct jz_spi *spi)
  334. {
  335. u32 tmp;
  336. tmp = spi_readl(spi, SSI_CR0);
  337. tmp |= CR0_RIE | CR0_REIE;
  338. spi_writel(spi, SSI_CR0, tmp);
  339. }
  340. static inline void spi_disable_rx_intr(struct jz_spi *spi)
  341. {
  342. u32 tmp;
  343. tmp = spi_readl(spi, SSI_CR0);
  344. tmp &= ~(CR0_RIE | CR0_REIE);
  345. spi_writel(spi, SSI_CR0, tmp);
  346. }
  347. static inline void spi_enable_tx_error_intr(struct jz_spi *spi)
  348. {
  349. u32 tmp;
  350. tmp = spi_readl(spi, SSI_CR0);
  351. tmp |= CR0_TEIE;
  352. spi_writel(spi, SSI_CR0, tmp);
  353. }
  354. static inline void spi_disable_tx_error_intr(struct jz_spi *spi)
  355. {
  356. u32 tmp;
  357. tmp = spi_readl(spi, SSI_CR0);
  358. tmp &= ~CR0_TEIE;
  359. spi_writel(spi, SSI_CR0, tmp);
  360. }
  361. static inline void spi_enable_rx_error_intr(struct jz_spi *spi)
  362. {
  363. u32 tmp;
  364. tmp = spi_readl(spi, SSI_CR0);
  365. tmp |= CR0_REIE;
  366. spi_writel(spi, SSI_CR0, tmp);
  367. }
  368. static inline void spi_disable_rx_error_intr(struct jz_spi *spi)
  369. {
  370. u32 tmp;
  371. tmp = spi_readl(spi, SSI_CR0);
  372. tmp &= ~CR0_REIE;
  373. spi_writel(spi, SSI_CR0, tmp);
  374. }
  375. static inline void spi_underrun_auto_clear(struct jz_spi *spi)
  376. {
  377. u32 tmp;
  378. tmp = spi_readl(spi, SSI_CR0);
  379. tmp |= CR0_EACLRUN;
  380. spi_writel(spi, SSI_CR0, tmp);
  381. }
  382. static inline void spi_clear_errors(struct jz_spi *spi)
  383. {
  384. u32 tmp;
  385. tmp = spi_readl(spi, SSI_SR);
  386. tmp &= ~(SR_UNDR | SR_OVER);
  387. spi_writel(spi, SSI_SR, tmp);
  388. }
  389. static inline void spi_set_format(struct jz_spi *spi)
  390. {
  391. u32 tmp;
  392. tmp = spi_readl(spi, SSI_CR1);
  393. tmp &= ~CR1_FMAT_MASK;
  394. tmp |= CR1_FMAT_SPI;
  395. tmp &= ~(CR1_TFVCK_MASK | CR1_TCKFI_MASK);
  396. tmp |= (CR1_TFVCK_0 | CR1_TCKFI_0);
  397. // tmp |= (CR1_TFVCK_1 | CR1_TCKFI_1);
  398. // tmp |= (CR1_TFVCK_2 | CR1_TCKFI_2);
  399. // tmp |= (CR1_TFVCK_3 | CR1_TCKFI_3);
  400. spi_writel(spi, SSI_CR1, tmp);
  401. }
  402. static inline void spi_enable_receive(struct jz_spi *spi)
  403. {
  404. u32 tmp;
  405. tmp = spi_readl(spi, SSI_CR0);
  406. tmp &= ~CR0_DISREV;
  407. spi_writel(spi, SSI_CR0, tmp);
  408. }
  409. static inline void spi_disable_receive(struct jz_spi *spi)
  410. {
  411. u32 tmp;
  412. tmp = spi_readl(spi, SSI_CR0);
  413. tmp |= CR0_DISREV;
  414. spi_writel(spi, SSI_CR0, tmp);
  415. }
  416. static inline void spi_flush_fifo(struct jz_spi *spi)
  417. {
  418. u32 tmp;
  419. tmp = spi_readl(spi, SSI_CR0);
  420. tmp |= CR0_TFLUSH | CR0_RFLUSH;
  421. spi_writel(spi, SSI_CR0, tmp);
  422. }
  423. static inline void spi_finish_transmit(struct jz_spi *spi)
  424. {
  425. u32 tmp;
  426. tmp = spi_readl(spi, SSI_CR1);
  427. tmp &= ~CR1_UNFIN;
  428. spi_writel(spi, SSI_CR1, tmp);
  429. }
  430. static inline void spi_start_transmit(struct jz_spi *spi)
  431. {
  432. u32 tmp;
  433. tmp = spi_readl(spi, SSI_CR1);
  434. tmp |= CR1_UNFIN;
  435. spi_writel(spi, SSI_CR1, tmp);
  436. }
  437. static inline int spi_is_rxfifo_empty(struct jz_spi *spi)
  438. {
  439. return spi_readl(spi, SSI_SR) & SR_RFE;
  440. }
  441. static inline int spi_check_busy(struct jz_spi *spi)
  442. {
  443. return spi_readl(spi, SSI_SR) & SR_BUSY;
  444. }
  445. static inline void spi_disable(struct jz_spi *spi)
  446. {
  447. u32 tmp;
  448. tmp = spi_readl(spi, SSI_CR0);
  449. tmp &= ~CR0_SSIE;
  450. spi_writel(spi, SSI_CR0, tmp);
  451. }
  452. static inline void spi_enable(struct jz_spi *spi)
  453. {
  454. u32 tmp;
  455. tmp = spi_readl(spi, SSI_CR0);
  456. tmp |= CR0_SSIE;
  457. spi_writel(spi, SSI_CR0, tmp);
  458. }
  459. static inline u32 spi_get_rxfifo_count(struct jz_spi *spi)
  460. {
  461. return (spi_readl(spi, SSI_SR) & SR_RFIFONUM_MASK) >> SR_RFIFONUM_BIT;
  462. }
  463. static inline void spi_flush_txfifo(struct jz_spi *spi)
  464. {
  465. u32 tmp;
  466. tmp = spi_readl(spi, SSI_CR0);
  467. tmp |= CR0_TFLUSH;
  468. spi_writel(spi, SSI_CR0, tmp);
  469. }
  470. static inline void spi_flush_rxfifo(struct jz_spi *spi)
  471. {
  472. u32 tmp;
  473. tmp = spi_readl(spi, SSI_CR0);
  474. tmp |= CR0_RFLUSH;
  475. spi_writel(spi, SSI_CR0, tmp);
  476. }
  477. static inline int spi_get_underrun(struct jz_spi *spi)
  478. {
  479. return spi_readl(spi, SSI_SR) & SR_UNDR;
  480. }
  481. static inline int spi_get_overrun(struct jz_spi *spi)
  482. {
  483. return spi_readl(spi, SSI_SR) & SR_OVER;
  484. }
  485. static inline int spi_get_transfer_end(struct jz_spi *spi)
  486. {
  487. return spi_readl(spi, SSI_SR) & SR_END;
  488. }
  489. static inline int spi_get_tx_error_intr(struct jz_spi *spi)
  490. {
  491. return spi_readl(spi, SSI_CR0) & CR0_TEIE;
  492. }
  493. static inline int spi_get_rx_error_intr(struct jz_spi *spi)
  494. {
  495. return spi_readl(spi, SSI_CR0) & CR0_REIE;
  496. }
  497. static inline int spi_get_rxfifo_half_full(struct jz_spi *spi)
  498. {
  499. return spi_readl(spi, SSI_SR) & SR_RFHF;
  500. }
  501. static inline int spi_get_txfifo_half_empty(struct jz_spi *spi)
  502. {
  503. return spi_readl(spi, SSI_SR) & SR_TFHE;
  504. }
  505. static inline int spi_get_txfifo_half_empty_intr(struct jz_spi *spi)
  506. {
  507. return spi_readl(spi, SSI_CR0) & CR0_TIE;
  508. }
  509. static inline int spi_get_rxfifo_half_full_intr(struct jz_spi *spi)
  510. {
  511. return spi_readl(spi, SSI_CR0) & CR0_RIE;
  512. }
  513. static inline void spi_select_ce0(struct jz_spi *spi)
  514. {
  515. u32 tmp;
  516. tmp = spi_readl(spi, SSI_CR0);
  517. tmp &= ~CR0_FSEL;
  518. spi_writel(spi, SSI_CR0, tmp);
  519. }
  520. static inline void spi_select_ce1(struct jz_spi *spi)
  521. {
  522. u32 tmp;
  523. tmp = spi_readl(spi, SSI_CR0);
  524. tmp |= CR0_FSEL;
  525. spi_writel(spi, SSI_CR0, tmp);
  526. }
  527. static inline void spi_send_data(struct jz_spi *spi, u32 value)
  528. {
  529. spi_writel(spi, SSI_DR, value);
  530. }
  531. /* the spi->mode bits understood by this driver: */
  532. #define MODEBITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LSB_FIRST | SPI_LOOP)
  533. #define SPI_BITS_SUPPORT (SPI_BITS_8 | SPI_BITS_16 | SPI_BITS_32)
  534. #endif /* _SPI_MASTER_H_ */