ftssp010_spi.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * (C) Copyright 2013
  3. * Faraday Technology Corporation. <http://www.faraday-tech.com/tw/>
  4. * Kuo-Jung Su <dantesu@gmail.com>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <common.h>
  9. #include <linux/compat.h>
  10. #include <asm/io.h>
  11. #include <malloc.h>
  12. #include <spi.h>
  13. #ifndef CONFIG_FTSSP010_BASE_LIST
  14. #define CONFIG_FTSSP010_BASE_LIST { CONFIG_FTSSP010_BASE }
  15. #endif
  16. #ifndef CONFIG_FTSSP010_GPIO_BASE
  17. #define CONFIG_FTSSP010_GPIO_BASE 0
  18. #endif
  19. #ifndef CONFIG_FTSSP010_GPIO_LIST
  20. #define CONFIG_FTSSP010_GPIO_LIST { CONFIG_FTSSP010_GPIO_BASE }
  21. #endif
  22. #ifndef CONFIG_FTSSP010_CLOCK
  23. #define CONFIG_FTSSP010_CLOCK clk_get_rate("SSP");
  24. #endif
  25. #ifndef CONFIG_FTSSP010_TIMEOUT
  26. #define CONFIG_FTSSP010_TIMEOUT 100
  27. #endif
  28. /* FTSSP010 chip registers */
  29. struct ftssp010_regs {
  30. uint32_t cr[3];/* control register */
  31. uint32_t sr; /* status register */
  32. uint32_t icr; /* interrupt control register */
  33. uint32_t isr; /* interrupt status register */
  34. uint32_t dr; /* data register */
  35. uint32_t rsvd[17];
  36. uint32_t revr; /* revision register */
  37. uint32_t fear; /* feature register */
  38. };
  39. /* Control Register 0 */
  40. #define CR0_FFMT_MASK (7 << 12)
  41. #define CR0_FFMT_SSP (0 << 12)
  42. #define CR0_FFMT_SPI (1 << 12)
  43. #define CR0_FFMT_MICROWIRE (2 << 12)
  44. #define CR0_FFMT_I2S (3 << 12)
  45. #define CR0_FFMT_AC97 (4 << 12)
  46. #define CR0_FLASH (1 << 11)
  47. #define CR0_FSDIST(x) (((x) & 0x03) << 8)
  48. #define CR0_LOOP (1 << 7) /* loopback mode */
  49. #define CR0_LSB (1 << 6) /* LSB */
  50. #define CR0_FSPO (1 << 5) /* fs atcive low (I2S only) */
  51. #define CR0_FSJUSTIFY (1 << 4)
  52. #define CR0_OPM_SLAVE (0 << 2)
  53. #define CR0_OPM_MASTER (3 << 2)
  54. #define CR0_OPM_I2S_MSST (3 << 2) /* master stereo mode */
  55. #define CR0_OPM_I2S_MSMO (2 << 2) /* master mono mode */
  56. #define CR0_OPM_I2S_SLST (1 << 2) /* slave stereo mode */
  57. #define CR0_OPM_I2S_SLMO (0 << 2) /* slave mono mode */
  58. #define CR0_SCLKPO (1 << 1) /* clock polarity */
  59. #define CR0_SCLKPH (1 << 0) /* clock phase */
  60. /* Control Register 1 */
  61. #define CR1_PDL(x) (((x) & 0xff) << 24) /* padding length */
  62. #define CR1_SDL(x) ((((x) - 1) & 0x1f) << 16) /* data length */
  63. #define CR1_DIV(x) (((x) - 1) & 0xffff) /* clock divider */
  64. /* Control Register 2 */
  65. #define CR2_CS(x) (((x) & 3) << 10) /* CS/FS select */
  66. #define CR2_FS (1 << 9) /* CS/FS signal level */
  67. #define CR2_TXEN (1 << 8) /* tx enable */
  68. #define CR2_RXEN (1 << 7) /* rx enable */
  69. #define CR2_RESET (1 << 6) /* chip reset */
  70. #define CR2_TXFC (1 << 3) /* tx fifo Clear */
  71. #define CR2_RXFC (1 << 2) /* rx fifo Clear */
  72. #define CR2_TXDOE (1 << 1) /* tx data output enable */
  73. #define CR2_EN (1 << 0) /* chip enable */
  74. /* Status Register */
  75. #define SR_RFF (1 << 0) /* rx fifo full */
  76. #define SR_TFNF (1 << 1) /* tx fifo not full */
  77. #define SR_BUSY (1 << 2) /* chip busy */
  78. #define SR_RFVE(reg) (((reg) >> 4) & 0x1f) /* rx fifo valid entries */
  79. #define SR_TFVE(reg) (((reg) >> 12) & 0x1f) /* tx fifo valid entries */
  80. /* Feature Register */
  81. #define FEAR_BITS(reg) ((((reg) >> 0) & 0xff) + 1) /* data width */
  82. #define FEAR_RFSZ(reg) ((((reg) >> 8) & 0xff) + 1) /* rx fifo size */
  83. #define FEAR_TFSZ(reg) ((((reg) >> 16) & 0xff) + 1) /* tx fifo size */
  84. #define FEAR_AC97 (1 << 24)
  85. #define FEAR_I2S (1 << 25)
  86. #define FEAR_SPI_MWR (1 << 26)
  87. #define FEAR_SSP (1 << 27)
  88. #define FEAR_SPDIF (1 << 28)
  89. /* FTGPIO010 chip registers */
  90. struct ftgpio010_regs {
  91. uint32_t out; /* 0x00: Data Output */
  92. uint32_t in; /* 0x04: Data Input */
  93. uint32_t dir; /* 0x08: Direction */
  94. uint32_t bypass; /* 0x0c: Bypass */
  95. uint32_t set; /* 0x10: Data Set */
  96. uint32_t clr; /* 0x14: Data Clear */
  97. uint32_t pull_up; /* 0x18: Pull-Up Enabled */
  98. uint32_t pull_st; /* 0x1c: Pull State (0=pull-down, 1=pull-up) */
  99. };
  100. struct ftssp010_gpio {
  101. struct ftgpio010_regs *regs;
  102. uint32_t pin;
  103. };
  104. struct ftssp010_spi {
  105. struct spi_slave slave;
  106. struct ftssp010_gpio gpio;
  107. struct ftssp010_regs *regs;
  108. uint32_t fifo;
  109. uint32_t mode;
  110. uint32_t div;
  111. uint32_t clk;
  112. uint32_t speed;
  113. uint32_t revision;
  114. };
  115. static inline struct ftssp010_spi *to_ftssp010_spi(struct spi_slave *slave)
  116. {
  117. return container_of(slave, struct ftssp010_spi, slave);
  118. }
  119. static int get_spi_chip(int bus, struct ftssp010_spi *chip)
  120. {
  121. uint32_t fear, base[] = CONFIG_FTSSP010_BASE_LIST;
  122. if (bus >= ARRAY_SIZE(base) || !base[bus])
  123. return -1;
  124. chip->regs = (struct ftssp010_regs *)base[bus];
  125. chip->revision = readl(&chip->regs->revr);
  126. fear = readl(&chip->regs->fear);
  127. chip->fifo = min_t(uint32_t, FEAR_TFSZ(fear), FEAR_RFSZ(fear));
  128. return 0;
  129. }
  130. static int get_spi_gpio(int bus, struct ftssp010_gpio *chip)
  131. {
  132. uint32_t base[] = CONFIG_FTSSP010_GPIO_LIST;
  133. if (bus >= ARRAY_SIZE(base) || !base[bus])
  134. return -1;
  135. chip->regs = (struct ftgpio010_regs *)(base[bus] & 0xfff00000);
  136. chip->pin = base[bus] & 0x1f;
  137. /* make it an output pin */
  138. setbits_le32(&chip->regs->dir, 1 << chip->pin);
  139. return 0;
  140. }
  141. static int ftssp010_wait(struct ftssp010_spi *chip)
  142. {
  143. struct ftssp010_regs *regs = chip->regs;
  144. ulong t;
  145. /* wait until device idle */
  146. for (t = get_timer(0); get_timer(t) < CONFIG_FTSSP010_TIMEOUT; ) {
  147. if (!(readl(&regs->sr) & SR_BUSY))
  148. return 0;
  149. }
  150. puts("ftspi010: busy timeout\n");
  151. return -1;
  152. }
  153. static int ftssp010_wait_tx(struct ftssp010_spi *chip)
  154. {
  155. struct ftssp010_regs *regs = chip->regs;
  156. ulong t;
  157. /* wait until tx fifo not full */
  158. for (t = get_timer(0); get_timer(t) < CONFIG_FTSSP010_TIMEOUT; ) {
  159. if (readl(&regs->sr) & SR_TFNF)
  160. return 0;
  161. }
  162. puts("ftssp010: tx timeout\n");
  163. return -1;
  164. }
  165. static int ftssp010_wait_rx(struct ftssp010_spi *chip)
  166. {
  167. struct ftssp010_regs *regs = chip->regs;
  168. ulong t;
  169. /* wait until rx fifo not empty */
  170. for (t = get_timer(0); get_timer(t) < CONFIG_FTSSP010_TIMEOUT; ) {
  171. if (SR_RFVE(readl(&regs->sr)))
  172. return 0;
  173. }
  174. puts("ftssp010: rx timeout\n");
  175. return -1;
  176. }
  177. static int ftssp010_spi_work_transfer_v2(struct ftssp010_spi *chip,
  178. const void *tx_buf, void *rx_buf, int len, uint flags)
  179. {
  180. struct ftssp010_regs *regs = chip->regs;
  181. const uint8_t *txb = tx_buf;
  182. uint8_t *rxb = rx_buf;
  183. while (len > 0) {
  184. int i, depth = min(chip->fifo >> 2, len);
  185. uint32_t xmsk = 0;
  186. if (tx_buf) {
  187. for (i = 0; i < depth; ++i) {
  188. ftssp010_wait_tx(chip);
  189. writel(*txb++, &regs->dr);
  190. }
  191. xmsk |= CR2_TXEN | CR2_TXDOE;
  192. if ((readl(&regs->cr[2]) & xmsk) != xmsk)
  193. setbits_le32(&regs->cr[2], xmsk);
  194. }
  195. if (rx_buf) {
  196. xmsk |= CR2_RXEN;
  197. if ((readl(&regs->cr[2]) & xmsk) != xmsk)
  198. setbits_le32(&regs->cr[2], xmsk);
  199. for (i = 0; i < depth; ++i) {
  200. ftssp010_wait_rx(chip);
  201. *rxb++ = (uint8_t)readl(&regs->dr);
  202. }
  203. }
  204. len -= depth;
  205. }
  206. return 0;
  207. }
  208. static int ftssp010_spi_work_transfer_v1(struct ftssp010_spi *chip,
  209. const void *tx_buf, void *rx_buf, int len, uint flags)
  210. {
  211. struct ftssp010_regs *regs = chip->regs;
  212. const uint8_t *txb = tx_buf;
  213. uint8_t *rxb = rx_buf;
  214. while (len > 0) {
  215. int i, depth = min(chip->fifo >> 2, len);
  216. uint32_t tmp;
  217. for (i = 0; i < depth; ++i) {
  218. ftssp010_wait_tx(chip);
  219. writel(txb ? (*txb++) : 0, &regs->dr);
  220. }
  221. for (i = 0; i < depth; ++i) {
  222. ftssp010_wait_rx(chip);
  223. tmp = readl(&regs->dr);
  224. if (rxb)
  225. *rxb++ = (uint8_t)tmp;
  226. }
  227. len -= depth;
  228. }
  229. return 0;
  230. }
  231. static void ftssp010_cs_set(struct ftssp010_spi *chip, int high)
  232. {
  233. struct ftssp010_regs *regs = chip->regs;
  234. struct ftssp010_gpio *gpio = &chip->gpio;
  235. uint32_t mask;
  236. /* cs pull high/low */
  237. if (chip->revision >= 0x11900) {
  238. mask = CR2_CS(chip->slave.cs) | (high ? CR2_FS : 0);
  239. writel(mask, &regs->cr[2]);
  240. } else if (gpio->regs) {
  241. mask = 1 << gpio->pin;
  242. if (high)
  243. writel(mask, &gpio->regs->set);
  244. else
  245. writel(mask, &gpio->regs->clr);
  246. }
  247. /* extra delay for signal propagation */
  248. udelay_masked(1);
  249. }
  250. /*
  251. * Determine if a SPI chipselect is valid.
  252. * This function is provided by the board if the low-level SPI driver
  253. * needs it to determine if a given chipselect is actually valid.
  254. *
  255. * Returns: 1 if bus:cs identifies a valid chip on this board, 0
  256. * otherwise.
  257. */
  258. int spi_cs_is_valid(unsigned int bus, unsigned int cs)
  259. {
  260. struct ftssp010_spi chip;
  261. if (get_spi_chip(bus, &chip))
  262. return 0;
  263. if (!cs)
  264. return 1;
  265. else if ((cs < 4) && (chip.revision >= 0x11900))
  266. return 1;
  267. return 0;
  268. }
  269. /*
  270. * Activate a SPI chipselect.
  271. * This function is provided by the board code when using a driver
  272. * that can't control its chipselects automatically (e.g.
  273. * common/soft_spi.c). When called, it should activate the chip select
  274. * to the device identified by "slave".
  275. */
  276. void spi_cs_activate(struct spi_slave *slave)
  277. {
  278. struct ftssp010_spi *chip = to_ftssp010_spi(slave);
  279. struct ftssp010_regs *regs = chip->regs;
  280. /* cs pull */
  281. if (chip->mode & SPI_CS_HIGH)
  282. ftssp010_cs_set(chip, 1);
  283. else
  284. ftssp010_cs_set(chip, 0);
  285. /* chip enable + fifo clear */
  286. setbits_le32(&regs->cr[2], CR2_EN | CR2_TXFC | CR2_RXFC);
  287. }
  288. /*
  289. * Deactivate a SPI chipselect.
  290. * This function is provided by the board code when using a driver
  291. * that can't control its chipselects automatically (e.g.
  292. * common/soft_spi.c). When called, it should deactivate the chip
  293. * select to the device identified by "slave".
  294. */
  295. void spi_cs_deactivate(struct spi_slave *slave)
  296. {
  297. struct ftssp010_spi *chip = to_ftssp010_spi(slave);
  298. /* wait until chip idle */
  299. ftssp010_wait(chip);
  300. /* cs pull */
  301. if (chip->mode & SPI_CS_HIGH)
  302. ftssp010_cs_set(chip, 0);
  303. else
  304. ftssp010_cs_set(chip, 1);
  305. }
  306. void spi_init(void)
  307. {
  308. /* nothing to do */
  309. }
  310. struct spi_slave *spi_setup_slave(uint bus, uint cs, uint max_hz, uint mode)
  311. {
  312. struct ftssp010_spi *chip;
  313. if (mode & SPI_3WIRE) {
  314. puts("ftssp010: can't do 3-wire\n");
  315. return NULL;
  316. }
  317. if (mode & SPI_SLAVE) {
  318. puts("ftssp010: can't do slave mode\n");
  319. return NULL;
  320. }
  321. if (mode & SPI_PREAMBLE) {
  322. puts("ftssp010: can't skip preamble bytes\n");
  323. return NULL;
  324. }
  325. if (!spi_cs_is_valid(bus, cs)) {
  326. puts("ftssp010: invalid (bus, cs)\n");
  327. return NULL;
  328. }
  329. chip = spi_alloc_slave(struct ftssp010_spi, bus, cs);
  330. if (!chip)
  331. return NULL;
  332. if (get_spi_chip(bus, chip))
  333. goto free_out;
  334. if (chip->revision < 0x11900 && get_spi_gpio(bus, &chip->gpio)) {
  335. puts("ftssp010: Before revision 1.19.0, its clock & cs are\n"
  336. "controlled by tx engine which is not synced with rx engine,\n"
  337. "so the clock & cs might be shutdown before rx engine\n"
  338. "finishs its jobs.\n"
  339. "If possible, please add a dedicated gpio for it.\n");
  340. }
  341. chip->mode = mode;
  342. chip->clk = CONFIG_FTSSP010_CLOCK;
  343. chip->div = 2;
  344. if (max_hz) {
  345. while (chip->div < 0xffff) {
  346. if ((chip->clk / (2 * chip->div)) <= max_hz)
  347. break;
  348. chip->div += 1;
  349. }
  350. }
  351. chip->speed = chip->clk / (2 * chip->div);
  352. return &chip->slave;
  353. free_out:
  354. free(chip);
  355. return NULL;
  356. }
  357. void spi_free_slave(struct spi_slave *slave)
  358. {
  359. struct ftssp010_spi *chip = to_ftssp010_spi(slave);
  360. free(chip);
  361. }
  362. int spi_claim_bus(struct spi_slave *slave)
  363. {
  364. struct ftssp010_spi *chip = to_ftssp010_spi(slave);
  365. struct ftssp010_regs *regs = chip->regs;
  366. writel(CR1_SDL(8) | CR1_DIV(chip->div), &regs->cr[1]);
  367. if (chip->revision >= 0x11900) {
  368. writel(CR0_OPM_MASTER | CR0_FFMT_SPI | CR0_FSPO | CR0_FLASH,
  369. &regs->cr[0]);
  370. writel(CR2_TXFC | CR2_RXFC,
  371. &regs->cr[2]);
  372. } else {
  373. writel(CR0_OPM_MASTER | CR0_FFMT_SPI | CR0_FSPO,
  374. &regs->cr[0]);
  375. writel(CR2_TXFC | CR2_RXFC | CR2_EN | CR2_TXDOE,
  376. &regs->cr[2]);
  377. }
  378. if (chip->mode & SPI_LOOP)
  379. setbits_le32(&regs->cr[0], CR0_LOOP);
  380. if (chip->mode & SPI_CPOL)
  381. setbits_le32(&regs->cr[0], CR0_SCLKPO);
  382. if (chip->mode & SPI_CPHA)
  383. setbits_le32(&regs->cr[0], CR0_SCLKPH);
  384. spi_cs_deactivate(slave);
  385. return 0;
  386. }
  387. void spi_release_bus(struct spi_slave *slave)
  388. {
  389. struct ftssp010_spi *chip = to_ftssp010_spi(slave);
  390. struct ftssp010_regs *regs = chip->regs;
  391. writel(0, &regs->cr[2]);
  392. }
  393. int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
  394. const void *dout, void *din, unsigned long flags)
  395. {
  396. struct ftssp010_spi *chip = to_ftssp010_spi(slave);
  397. uint32_t len = bitlen >> 3;
  398. if (flags & SPI_XFER_BEGIN)
  399. spi_cs_activate(slave);
  400. if (chip->revision >= 0x11900)
  401. ftssp010_spi_work_transfer_v2(chip, dout, din, len, flags);
  402. else
  403. ftssp010_spi_work_transfer_v1(chip, dout, din, len, flags);
  404. if (flags & SPI_XFER_END)
  405. spi_cs_deactivate(slave);
  406. return 0;
  407. }